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> dp(n,vector(n));
        int start = 0;
        int longest = 1;
        for(int i =0;i

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 l(n,1);
        int pos = 0,mx=0;
        int start = 0,longest = 1;
        for(int i =0;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);
    }
};

你可能感兴趣的:(LeetCode 5. Longest Palindromic Substring(最长回文子串))