LeetCode 5. Longest Palindromic Substring(最长回文子串)

思路:有两种
1.dp
dp[i][j] = 1 when dp[i+1][j-1] == 1&&s[i]==s[j]
dp[i][j] = 0 when dp[i+1][j-1] = 0
dp[i][i] = 1
dp[i][i+1] = s[i]==s[j]? 1:0;()注意此时要更新start 和 longest

class Solution {
public:
    /*
    回环有两种,abba,aba
    abcd,abc
    用DP[i][j] = 1 ||0
    */
    
    string longestPalindrome(string s) {
        int n = s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        int start = 0;
        int longest = 1;
        for(int i =0;i<n;i++){
            dp[i][i] = 1;
            if(i<n-1){
                if(s[i] == s[i+1])
                {
                    start = i;
                    longest = 2;
                    dp[i][i+1] = 1;
                }else
                    dp[i][i+1] = 0;
            }
        }

        for(int l = 3;l<=n;l++)
            for(int i =0;i+l-1<n;i++)
            {
                int j = i+l-1;
                if(dp[i+1][j-1] ==1 &&s[i] == s[j])
                {
                    dp[i][j] = 1;
                    start = i;
                    longest = l;
                } 
                
            }
        return s.substr(start,longest);
    }
};

Manacher算法,具体过程可以看https://www.cnblogs.com/mini-coconut/p/9074315.html,但是他的代码有错误哦

start = (i-l[i]+1)/2

class Solution {
public:
    string longestPalindrome(string s) {
        string ms = "#";
        for(auto c:s)ms =ms+c+"#";
        int n = ms.size();
        if(n<3)return "";
        vector<int> l(n,1);
        int pos = 0,mx=0;
        int start = 0,longest = 1;
        for(int i =0;i<n;i++){
            //首先 i在mx范围内吗,内可以赋对称的值,外初始为1
            l[i] = i<mx?min(l[2*pos-i],mx-i):1;
            //继续找最大子串
            while(l[i]+i<n&&i-l[i]>-1&&ms[i-l[i]] == ms[i+l[i]])l[i]++;
            //更新结果
            if(l[i]+i>mx)
            {
                pos = i;
                mx = l[i]+i;
            }
            if(l[i]-1>longest)
            {
                start = i-l[i]+1;
                longest =l[i]-1;
            }
        }
        
        return s.substr(start/2,longest);
    }
};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容