栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C/C++】【leetcode 5】最长回文子串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C/C++】【leetcode 5】最长回文子串

leetcode 5

解题思路

动态规划求解
vector> dp(n,vector(n)); // dp[i][j]表示从i到j是否是回文串

  • 初始化:dp[i][i]=1只有一个字母必然是回文字符串,如果s[i]==s[i+1],dp[i][i+1]=1。
  • 动态转移方程: dp[i][j] = dp[i+1][j-1] & (s[i] == s[j]);

注意点

  • dp[i][j]是由dp[i+1][j-1]得来,所以计算第i行时要知道第i+1行的值,倒着计算。
  • substr(start,length):求子串函数
时间复杂度

T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)

代码
class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if(n < 2)return s;
        //dp[i][j]表示当前从i到j是否是回文串
        vector> dp(n,vector(n));
        for(int i = 0;i < n;++i)dp[i][i] = 1;
        string res = s.substr(0,1);//记录结果
        int tmp = 0;//记录长度
        for(int i = n-2;i >= 0;--i){
            if(s[i] == s[i+1]){
                dp[i][i+1] = 1;
                if(tmp < 2)res = s.substr(i,2);
            }
            else dp[i][i+1] = 0;
            for(int j = i + 2;j < n;++j){
                dp[i][j] = dp[i+1][j-1] & (s[i] == s[j]);
                if(dp[i][j] && (j - i + 1 > tmp)){
                    tmp = j - i + 1;
                    res = s.substr(i,tmp);
                }
            }
        }
        return res;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1037478.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号