随笔 - 112  文章 - 0  评论 - 0  阅读 - 1382

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

给你一个字符串 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   _月生  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示