leetcode5. Longest Palindromic Substring

这道题是在一个字符串中寻找最长的回文子字符串的。

最常用的就是Manancher算法了,这个方法使用的是O(N)的时间复杂度的,使用p[i]来作为半径的值的,然后根据mx来记录半径的关系并且进行更新的,这个方法最主要的还是他的巧妙性和构造方法的独特性的。

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()==0) return s;
        string str="$#";
        for(int i=0;i<s.size();i++){
            str+=s[i];
            str+='#';
        }
        vector<int> p(str.size(),0);
        int id=0,mx=0, resId=0,resMx=0;
        for(int i=0;i<str.size();i++){
            p[i]=(mx>i)?min(p[2*id-i],mx-i):1;
            while(str[i+p[i]]==str[i-p[i]]) p[i]++;
            
            if(mx<i+p[i]){
                mx=i+p[i];
                id=i;
            }
            if(resMx<p[i]){
                resMx=p[i];
                resId=i;
            }
            
        }
        return s.substr((resId-resMx)/2,resMx-1);
    }
};

如果不知道这个算法的话,在关于回文字符串中因为存在着可以使用对应的子字符来进行判断的,所以考虑使用动态规划的子结构的方法来进行判断的,在后面的题目中关于动态规划的题目还是蛮多的。

 其中在计算dp[j][i]的时候能利用到dp[j+1][i-1]的值的,所以外层是使用i进行循环的 ,而内层使用的j进行循环的。

class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size()<=1) return s;
        vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
        int left=0,right=0,len=0;
        for(int i=0;i<s.size();i++){
            for(int j=0;j<i;j++){
                dp[j][i]=(s[i]==s[j] && (i-j<2 || dp[j+1][i-1]));
                if(dp[j][i] && i-j+1>len){
                    len=i-j+1;
                    left=j;
                }
            }
            dp[i][i]=1;
        }
        if(len==0) len=1; // 考虑如AC的输入情况的
        return s.substr(left,len);
    }
};

 

posted on 2018-09-11 15:56  昔风不止,唯有努力生存  阅读(103)  评论(0编辑  收藏  举报

导航