LeetCode-5-Longest Palindromic Substring(动态规划)-Medium

题意理解:

求解最长的回文;


题目分析:

1. 通过遍历完成,但算法的复杂度过高(O(N3));

2. 采用动态规划,复杂度为O(N2)(先前以为所谓的动态规划,就是像《算法导论》里车间的那个例子,从最终决策节点向终端节点进行递归,最终获得最优解。其实,只要是最终最优决策依赖于过程最优决策的方式都是动态规划)


解题代码:

class Solution {
public:
    string longestPalindrome(string s) {
        int sLen=s.length();
        if(sLen<=1){
            return s;
        }
        
        bool dp[sLen][sLen];
        
        int maxLen=1;
        int pos=0;
        for(int i=0;i<sLen;i++){
            dp[i][i]=true;
            if(i+1<sLen){
                if(s[i]==s[i+1]){
                    dp[i][i+1]=true;
                    maxLen=2;
                    pos=i;
                    // cout<<"pos= "<<pos<<endl;
                }else{
                    dp[i][i+1]=false;
                }
            }
        }
        
        for(int len=3;len<=sLen;len++){
            for(int i=0;i<sLen-len+1;i++){
                if(dp[i+1][i+len-2] && s[i]==s[i+len-1]){
                    dp[i][i+len-1]=true;
                    pos=i;
                    maxLen=len;
                }else{
                    dp[i][i+len-1]=false;
                }
            }
        }
        
        return s.substr(pos,maxLen);
    }
};

会超时的穷举代码:

class Solution {
private:
    bool isPalindromic(string s){
        if(s.length()<=1){
            return true;
        }
        
        int sLen=s.length();
        int halfLen=sLen/2;
        for(int i=0;i<halfLen;i++){
            if(s[i]!=s[sLen-1-i]){
                return false;
            }
        }
        
        return true;
    }    
public:
    string longestPalindrome(string s) {
        if(s.length()==0 || s.length()==1){
            return s;
        }

        string maxSubStr="";
        for(int i=0;i<s.length();i++){
            for(int j=i;j<s.length();j++){
                string t=s.substr(i,j-i+1);
                if(isPalindromic(t) && t.length()>maxSubStr.length()){
                    maxSubStr=t;
                    cout<<"maxSubStr= "<<maxSubStr<<endl;
                }
            }
        }
        
        return maxSubStr;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值