问题描述:求一给定字符串的最长回文子串,如google的最长回文子串是goog
思路:遍历所有可能的回文串中心,维护两个指针p、q从中心向两边移动直至回文边界,统计该回文长度并与当前最长回文长度比较、更新。注意回文有奇数长度如aba和偶数长度abba两种情况
代码:
void process(char * s){
assert(s != NULL);
int n = strlen(s), len_max = 0, len_cur;
int p, q;
int start = 0, end = 0; //start和end分别记录最长回文子串的首/尾
for(int i = 1; i < n; i++){ //遍历中心点
for(int j = 0; j <= 1; j++){ //j = 0为偶数长度回文,j = 1为奇数长度回文
p = i-1, q = i+j;
while(p >= 0 && q < n && s[p] == s[q])
p--, q++;
len_cur = q-p-1;
if(len_cur > len_max){
len_max = len_cur;
start = p+1;
end = q-1;
}
}
}
for(int i = start; i <= end; i++)
printf("%c", s[i]);
printf("\n");
}