1. 程式人生 > 其它 >Leetcode:最長迴文子串

Leetcode:最長迴文子串

題目描述:最長迴文子串
給你一個字串 s,找到 s 中最長的迴文子串。

示例 1:

輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。

示例 2:

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

示例 3:

輸入:s = "a"
輸出:"a"

示例 4:

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

提示:

1 <= s.length <= 1000
s 僅由數字和英文字母(大寫和/或小寫)組成

動態規劃 因為更長的迴文子串必須保證該子串的子串為迴文子串,因此可以使用動態規劃。

class Solution {
public:
    string longestPalindrome(string s) {
        int left=0,right,max=1;
        int n=s.size();
        bool ans[n][n];
        //新建一個判斷陣列,存放以(i,j)為邊界的子串是否為迴文子串的結果
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                ans[i][j]=false;
            }
            ans[i][i]=true;
        }
        for(int j=1;j<n;j++){
            for(int i=0;i<j;i++){
                if(s[i]!=s[j]){
                    ans[i][j]=false;
                }else{
                    //是否依賴該子串包含的子串是否為迴文子串,取決於該子串的長度是否大於4,即j-i+1>4。長度為3時只要邊界相等即為迴文子串
                    if(j-i>=3){
                        ans[i][j]=ans[i+1][j-1];
                    }else{
                        ans[i][j]=true;
                    }
                }
                if(ans[i][j]&&j-i+1>max){
                    left=i;
                    right=j;
                    max=j-i+1;
                }
            }
        }
        //切割字串,left為起點,max為長度
        return s.substr(left,max); 
    }
};