leetcode-最长回文子串_子串

注意这题求的是子串不是子序列

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()<2)
        return s;
        int len = s.length();
        int maxlen = 1;
        int start = 0;
        vector<vector<int>> dp(len, vector<int>(len,0));
        for(int i = 0; i < len; i++)
            dp[i][i] = 1;
        for(int L = 2; L <=len; L++)  // L是子串长度
            for(int i = 0; i < len; i++){  // i字符串开始位置

                int j = L + i -1;  // 右边界
                if(j>=len)  // 右边界超出范围
                    break;
                if(s[i]!=s[j])  // 不等于说明不是回文子串
                    dp[i][j] = 0;  
                else{
                    if(j-i<3)  // 小于3说明中间只有一个元素或者没有元素
                        dp[i][j] = 1; 
                    else  // 如果中间有多个元素,则判断dp[i+1][j-1]
                        dp[i][j] = dp[i+1][j-1];
                }

                if(dp[i][j]==1&&L > maxlen){  // 更新
                    maxlen = L;
                    start = i;
                }
            }
        return s.substr(start, maxlen);
    }
};