码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode] Longest Palindromic Substring 多种解法

时间:2015-07-16 09:52:23      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:leetcode   最长回文子串   string   多种解法   

很经典的题目,求字符串中的最长回文子串。

(1)最朴素的解法 ---暴力 复杂度O(N3)

这也是最容易想到的方法,最外层循环枚举起点i,第二层循环从i+1开始向后枚举,第三层判断是不是回文串。最后取最长子串的返回。

代码比较简单,这里没有列出。

(2)中心扩展法。复杂度O(N2)

枚举每一个字符作为中心点向左右扩展。但是这里要注意,对于每一次扩展要分奇偶两种情况。否则可能会漏掉情况。

一发现不满足的情况马上break进行下一个中心字符的判断,代码如下:

class Solution {
public:
    string longestPalindrome(string s) {
        string ans;
        int len=s.length();
        int maxLength=-1,CurLen,Sbegin;
        for(int i=0;i<len;i++)
        {
                int left=i-1,right=i+1;
                while(left>=0&&right<len&&s[left]==s[right])//奇数情况 
                {
                        CurLen=right-left+1;
                        if(CurLen>maxLength)
                        {
                        	maxLength=CurLen;
                        	Sbegin=left;
                        }
                        left--,right++;
                }
                
                left=i,right=i+1;
                while(left>=0&&right<len&&s[left]==s[right])//偶数情况 
                {
                        CurLen=right-left+1;
                        if(CurLen>maxLength)
                        {
                        	maxLength=CurLen;
                        	Sbegin=left;
                        }
                        left--,right++;
                }
               
        }
        ans=s.substr(Sbegin,maxLength);
        return ans;

    }
};

(3)Manacher算法,复杂度只有O(n)

 具体算法介绍:点击打开链接

附上精巧的代码:

class Solution {
public:
   string preProcess(string s) {  
     int  n = s.length();  
     if (n == 0) return "^$";  
     string ret = "^";  
     for (int i = 0; i < n; i++)  
        ret += "#" + s.substr(i, 1);  
     ret += "#$";  
    return ret;  
}  
   
string longestPalindrome(string s) {  
     string T = preProcess(s);  
     int n = T.length();  
     int *P = new int[n];  
     int C = 0, R = 0;  
     for (int i = 1; i < n-1; i++) {  
    int i_mirror = 2*C-i; // equals to i' = C - (i-C)  
    
    P[i] = (R > i) ? min(R-i, P[i_mirror]) : 0;  
  
    // Attempt to expand palindrome centered at i  
    while (T[i + 1 + P[i]] == T[i - 1 - P[i]])  
      P[i]++;  
   
    // If palindrome centered at i expand past R,  
    // adjust center based on expanded palindrome.  
    if (i + P[i] > R) {  
      C = i;  
      R = i + P[i];  
    }  
  }  
  // Find the maximum element in P.  
  int maxLen = 0;  
  int centerIndex = 0;  
  for (int i = 1; i < n-1; i++) {  
    if (P[i] > maxLen) {  
      maxLen = P[i];  
      centerIndex = i;  
    }  
  }  
  delete[] P;  
    
  return s.substr((centerIndex - 1 - maxLen)/2, maxLen);  
}  
};

(4)后缀树的解法,待补充




版权声明:本文为博主原创文章,未经博主允许不得转载。

[leetcode] Longest Palindromic Substring 多种解法

标签:leetcode   最长回文子串   string   多种解法   

原文地址:http://blog.csdn.net/nk_test/article/details/46901657

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!