LeetCode:最长回文子串(C语言版)
Posted 想考北航的小刺猬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:最长回文子串(C语言版)相关的知识,希望对你有一定的参考价值。
最长回文子串中心扩展算法实现
char * longestPalindrome(char * s)
int maxnum = 1; //单个字符一定是回文,所以最大距离的初始值为1
char *p = s;
char *max_start = s;
char *start, *end;
while(*p)
start = p;
end = p;
while(*(end+1) && *(end+1) == *end)
end++; //出现多个重复字符时如“ccc”,要递增end使其到达重复字符的最后一位
p = end + 1; //新位置在end之后一位
while(start > s && *(end+1) && *(start-1) == *(end+1))
start--;
end++;
int max = end - start + 1;
if (max > maxnum)
maxnum = max;
max_start = start;
char *rst = (char *) calloc(maxnum + 1, sizeof(char));
strncpy(rst, max_start, maxnum);
return rst;
- 主要思想就是从第一个字符开始进行循环,每个字符对应设置两个指针,一个向前移动,一个向后移动,从中间开始向两边扩展,一旦两边的字符不一样,就计算这两个指针之间的距离,也就是这个回文串的长度,当出现本次长度大于最大长度时,重写最大值,然后记录最前面的指针的位置。循环全部结束后,通过最大值和出现最大值时回文串的起始位置生成最终子串。calloc函数分配一个字符数组,将以上两个值作为参数,构建一个新的字符串,最后返回。
- 这里面主要有两个问题要注意,一个是循环的边界,另一个是字符串的处理。循环边界一个是要处理遇到连续相同字符时,要用while进行判断,直到end指针到达合适的位置,也就是end的下一位不能为空字符,同时要保证end的下一位要与end的值一样。另一个在扩展的过程中要保证start大于s,end的下一个值不能为空,并且end和start的下一次取值要相等,满足以上条件才能继续扩展。字符串处理也就是生成新的子串要用calloc函数,不能用malloc。
- 总结:这道题的思路并不是特别难整理,主要是在于编写代码时边界值的处理,同时中间扩展我认为是比动态规划更好的办法,一个原因是动态规划需要占用nxn的矩阵来记录每一个范围内的子串是不是回文,需要O(n^2)的空间,即便我们知道应用的空间只是矩阵的上三角,以此采用矩阵压缩也会耗费同一量级的空间,另一个就是思路并没有中间扩展算法来的快。
以上是关于LeetCode:最长回文子串(C语言版)的主要内容,如果未能解决你的问题,请参考以下文章