最长回文子串 leetcode5

class Solution {
public:
    string longestPalindrome(string s) {
        if (s.empty()) return "";
        int sLen = s.size();
        if (sLen == 1) return s;
        int maxLen = 0;
        int start = 0;
        string ans = "";
        vector<vector<int> > dp(s.size(), vector<int>(s.size(), 0));
        for (int i = 0; i < sLen; i++) {
            dp[i][i] = 1;
            maxLen = 1;
            start = 0;
        }
        // i最小 i==1 因为是和之前的值进行比较,这一点是必须要保证的,不然会越界
        for (int i = sLen - 1; i > 0; i--) {
            if (s[i-1] == s[i]) {
                dp[i-1][i] = 1;
                dp[i][i-1] = 1;
                maxLen = 2;
                start = i-1; // 更新以 i-1进行更新
            }          
        }
        // 主要是利用二维数组保持中间的结果, 后面进行的运算以来前面的结果
        // 在字符串[j, k]要判断s[j] 是否等于s[k], 以及之前的运算结果dp[j+1, k+1]是不是回文的
        // 如果是的话 就进行更新
        for (int k = 2; k < sLen; k++) {
            for (int j = 0; j < k; j++) {
                if (k - j >= 2 && s[j] == s[k] && dp[j+1][k-1] == 1) {
                    dp[j][k] = 1;
                    if (k-j+1 > maxLen) {
                        maxLen = k-j+1;
                        start = j;
                    }
                }
            }
        }
        ans = s.substr(start, maxLen);
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_36149892/article/details/80223423