最长回文串(二维动态规划)

给你一个字符串 s,找到 s 中最长的 回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

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


class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if(n<2) return s;//一个字符本身就是回文串
        int maxLen =1;
        int begin=0;
        //dp[i][j]表示s[i..j]是否为回文串
        vector<vector<int>> dp(n,vector<int>(n));
        //初始化:所有长度为 1 的子串都是回文串
        for(int i=0;i<n;i++)    
            dp[i][i] = true;
        //开始递推
        //即枚举字串长度
        for(int L=2;L<=n;L++){
            //枚举左边界
            for(int i=0;i<n;i++){
                //获取右边界
                int j = L+i-1;
                //越界就退出该层循环
                if(j>=n) break;
                if(s[i]!=s[j]){//如果第一个字符与最后一个字符不一致,直接设置为false
                    dp[i][j] = false;
                }else{
                    if(j-i<3){//s[i..j]有3/2个字符且s[i]==s[j],不需要之前的状态,直接设置为true
                        dp[i][j] = true;
                    }else{//多于三个字符,取决于内部是否为回文串
                        dp[i][j]=dp[i+1][j-1];
                    }
                }
                //计算出dp[i][j]后,只要dp[i][j] == true 成立,就表示子串 s[i..j] 是回文
                //此时记录回文长度和起始位置
                if(dp[i][j]&&j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin = i;
                }
            }
        }
        return s.substr(begin,maxLen);
    }
};

 

posted on 2025-01-09 16:56  _月生  阅读(24)  评论(0)    收藏  举报