[leetcode]5.最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"

注意: “aba” 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

思路:
1.采用动态规划,dp[i][j]=1表示i到j之间的序列为回文序列。
2.初始化dp[i]][i]=1,即长度为1的序列均为回文序列。
3.初始化长度为2的序列,即若s[i]==s[i+1],则dp[i][i+1]=1。
4.从长度len=3到s.size()遍历,状态转移方程:
1)s[i]==s[j] dp[i][j]=dp[i+1][j-1].
2)s[i]!=s[j] dp[i][j]=0.
5.在更新dp的时候保存最大的长度以及最大长度的起始地址。如果有多个保存第一个。

AC代码:(C++)

class Solution {
   public:
    string longestPalindrome(string s) {
        int len = s.size();
        if (len == 0 || len == 1) return s;
        int start = 0, max_length = 1, length = 1;
        vector<vector<int> > dp(len, vector<int>(len));
        for (int i = 0; i < len; i++) {
            dp[i][i] = 1;
            if (i < len - 1 && s[i] == s[i + 1]) {
                dp[i][i + 1] = 1;
                length = 2;
                if (length > max_length) {
                    max_length = length;
                    start = i;  //更新起始位置,保存最大长度
                }
            }
        }
        for (int l = 3; l <= len; l++) {
            for (int i = 0; i + l - 1 < len; i++) {
                int j = i + l - 1;
                if (s[i] == s[j] && dp[i + 1][j - 1] == 1) {
                    dp[i][j] = 1;
                    length = l;
                    if (length > max_length) {
                        max_length = length;
                        start = i;
                    }
                }
            }
        }
        return s.substr(start, max_length);
    }
};

你可能感兴趣的:(LeetCode)