给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

回文串:正反都一样的字符串

 


 

分析:

以每个字符为中心,判断每个字符左右是否相等,时间复杂度为O(n*n)

但要注意字符个数的奇偶情况,偶数个就以中间两个字符作为中心,奇数个就以一个字符作为中心

 

class Solution {
public:
    
    void equal(string s,int l,int r,int &start,int &maxlen){
        int len = s.size();
        while(l>=0 && r<=len-1 && s[r]==s[l]){
                l--;r++;
            }            
            if(maxlen<r-l-1){
                maxlen = r-l-1;
                start = l+1;
            }
    }
    
   
    string longestPalindrome(string s) {
        int len = s.size();
        int r,l;
        int start=0,maxlen=0;
        if(len<=1) return s;    
        
        for(int i=0;i<len-1;i++){
            l = i;r = i;
            equal(s,l,r,start,maxlen);
            l = i;r = i+1;
            equal(s,l,r,start,maxlen);            
        } 
        
        return s.substr(start,maxlen);
   }       
};

 

解法2:动态规划,

对于[i,j]区间内为回文串,dp[i][j] = 1,有

  • i = j ,一个字符肯定有dp[i][j] = 1
  • i = j-1,dp[i][j] = (s[i]==s[j])
  • i > j-1,dp[i][j] = s[i]==s[j]  && dp[i+1][j-1]

 

解法3:马拉车算法Manacher's Algorithm

 

posted on 2019-01-23 20:12  柠檬檬檬  阅读(94)  评论(0编辑  收藏  举报