给你一个字符串 s,找到 s 中最长的回文子串。
题解://函数是用于中心扩散,匹配出符合规则的回文子串
void extend(char*s, int left, int right, int *length){
//此处主要是针对两个扩散中心的回文子串
//超出了字符串长度就直接跳出函数
if (right >= strlen(s)){
return;
}
while (left >=0 && right length[1] - length[0]){
length[0] = left;
length[1] = right;
}
return;
}
char * longestPalindrome(char * s){
int length[2] ={0,0};
//中心扩散法,循环字符串
for (int i=0; i
前置知识
char *strncpy(char *dest, const char *src, size_t n)
用通俗的话来说:把 src 所指向的字符串复制到 dest,最多可复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填上。
需要注意的是,strncpy 不会自动加上结束符的,需要手动加上,不然会出问题的。
#include
#include
#include
int main(){
char string1[13] = "Hello World!";
char* need_c = (char*)malloc(sizeof(string1));
strncpy(need_c, string1, 6);
printf("%sn",need_c);
strncpy(need_c, string1 + 5, 6);
printf("%sn",need_c);
free(need_c);
}
:
回文字符串是什么?
aba、a 诸如此类称为一个扩散中心的回文字符串
aa、abba 诸如此类称为两个扩散中心的回文字符串
解题思路
因为两个扩散中心和一个扩散中心只有略微差异,故可只创建一个函数。
我们的方法是获得所给字符串中所有的回文子串,并判断哪个是最长的子串。于是可以设计一个能够判断回文子串的函数,这个函数随着遍历所给字符串,找出所有回文子串,并动态辨别哪个是最长的。
该函数为了区别一个扩散中心和两个扩散中心,设计滑动窗口。当为一个扩散中心时 ,初状态的左右窗口在同一个位置,若为两个扩散中心,则初状态的右窗口会比左窗口多一格。
在所给字符串遍历结束后,根据得到的数据进行创建。因为最后得到的左、右窗口不是正好对应着相应子串的两端,而是会比最长回文子串左右两端各长一格 。但因为数组下标的特性及字符数组最后需要添加结束符“ ”,得到的左、右窗口相减正好是所需要创建存储最长回文子串的长度。
图解
(两个扩散中心时,滑动窗口的初始状态) (滑动中)
(一个扩散中心时,滑动窗口的初始状态) (滑动中)
暑期编程PK赛
得CSDN机械键盘等精美礼品! 


