5. 最长回文子串

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5. 最长回文子串相关的知识,希望对你有一定的参考价值。

目录

1、Question

2、Analysis

3、Code

4、Execution


 1、Question

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

        输入:s = "babad"
        输出:"bab"
        解释:"aba" 同样是符合题意的答案。

示例 2:

        输入:s = "cbbd"
        输出:"bb"

示例 3:

        输入:s = "a"
        输出:"a"

示例 4:

        输入:s = "ac"
        输出:"a"

提示:

        1 <= s.length <= 1000
        s 仅由数字和英文字母(大写和/或小写)组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、Analysis

       思路比较简单,中心开花。遍历字符串( i 从 0 开始),以 i 作为中心点向两边同时扩散,每扩散一次就进行一次比较,遇到字符不一样的则结束扩散。

        上面的思路对于奇数个回文字符很有效,对于偶数个回文字符还需要多做些工作。首先我们需要知道为什么会出现偶数(举例:abba),是因为中间的两个字符是重复的,所以我们可以将中间重复的共同作为中心点。在选中 i 后先不急着向两边扩散,先将 i 周围与 i 位置字符一样的包含进去,共同作为中心点。

3、Code

char * longestPalindrome(char * s){
    int len = strlen(s), i = 0, j = 0, k = 0;
    int maxLen = 1, maxS = 0, maxE = 0; 
    for ( i = 0; i < len - 1; i++)
    {
        j = i - 1;
        k = i + 1;
        while (j >= 0 && s[j] == s[i]) j--;
        while (k < len && s[k] == s[i]) k++;
        while( j >= 0 && k < len)
        {
            if (s[j] != s[k]) break;
            j--;
            k++;
        }
        j++;
        k--;
        if (maxLen < (k - j + 1))
        {
            maxLen = k - j + 1;
            maxS = j;
            maxE = k;
        }
    }
    s[maxE + 1] = '\\0';
    return s + maxS; 
}

4、Execution 

 

以上是关于5. 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

leectcode 动态规划5.最长回文子串

LeetCode 5 最长回文子串

leetcode-5 最长回文子串(动态规划)

5. 最长回文子串

5-最长回文子串

[5]. 最长回文子串