最长回文串(二维动态规划)
给你一个字符串 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); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通