1. 程式人生 > >LeetCode 5. 最長迴文子串 Longest Palindromic Substring

LeetCode 5. 最長迴文子串 Longest Palindromic Substring

解法二

動態規劃,時間複雜度O(n^2).

利用動態規劃解題,i,j 分別表示子串的起始和結束位置,動態規劃矩陣dp[i][j]表示以是第i個元素開始,以第j個元素結束的子串是否為迴文串,是就記為1,否則記為0.

dp[i][j]的狀態與dp[i+1][j-1]相關,及當dp[i+1][j-1]且s[i] == s[j]的時候,我們就可以判定dp[i][j] = 1;

dp[i][j] = (s[i] == s[j]) && (dp[i+1][j-1] || j-i<=1);

//動態規劃 
string dp_longestPalindrome(string s) {
    int size = s.length();
    if(size <= 1) return s;
    
    int left=0,right=0,maxlen=1;
    int dp[size][size]={0};
    for(int i = 0;i < size;++i){
        for(int j = i-1;j >= 0 ;--j){
            if(s[i]==s[j] && (i-j<=1 || dp[j+1][i-1])) dp[i][j] = 1;
            if(dp[j][i] && maxlen < i-j+1){
                maxlen = i-j+1;
                right = i;
                left = j;
            }
        }
        dp[i][i] = 1;
    }
    return s.substr(left,right-left+1);
}

解法三

馬拉車演算法Manacher's Algorithm, 時間複雜度O(n).

PS:這個演算法我還沒看太懂,後續再回來補充。