计算机机试笔记——动态规划——最长回文字段

本文讨论了如何在给定字符串s中找到最长的回文子串,首先介绍了暴力算法的内存限制问题,然后引入了动态规划方法,优化了时间复杂度。通过两个类Solution的实现展示了从基础到高效的解决方案。
摘要由CSDN通过智能技术生成

#记录学习

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

暴力算法(内存不够)猜测是因为传递s所以内存不够,还有调用啥的

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size(),maxlen=1;
        string maxstr;
        if(s.size()==1){
            return s;
        }
        //vector<vector<bool>> dp(len,vector<bool>(len,false));
        maxstr= s.substr(1,1);
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                if(hui(i,j,s)){
                    if(maxlen<j-i+1){
                        maxstr = s.substr(i, j - i + 1);
                        maxlen=j-i+1;
                        }
                }
            }
        }
    return maxstr;
    }
    bool hui(int i,int j,string s){
        for(;j>=i;){
            if(s[i]!=s[j]){
                return false; 
            }
            i++;
            j--;
            if(j==i){return true;}
        }
        return true;
    }
};

 使用动态规划(时间复杂度好像差不多)

class Solution {
public:
    string longestPalindrome(string s) {
        int maxlen=0,begin=0;
        string ans;
        vector<vector<bool>> dp(s.size() + 1,
                                vector<bool>(s.size() + 1, false));
        for (int i = 0; i < s.size(); i++)
            dp[i][i] = true;
        //i由i+1,j由j-1
        for (int i = s.size()-1; i >= 0; i--) {
            for (int j = i; j < s.size(); j++) {
                if(s[i]==s[j]){
                    if(j-i<=2){dp[i][j]=true;}
                    else{dp[i][j]=dp[i+1][j-1];}
                    if(j-i+1>maxlen && dp[i][j]==true){
                        maxlen=j-i+1;
                        begin=i;
                    }
                }
                else{
                    dp[i][j]=false;
                }
            }
        }
        ans = s.substr(begin,maxlen);
        return ans;
    }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值