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语言版)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode刷题20.最长回文子串——Java版

C++&Python 描述 LeetCode 5. 最长回文子串

[LeetCode] 最长回文子串

LeetCode:无重复字符的最长子串(C语言版)

LeetCode:无重复字符的最长子串(C语言版)

[LeetCode] 647. 回文子串 ☆☆☆(最长子串动态规划中心扩展算法)