最长回文子串

来源:互联网 发布:网络连接线 编辑:程序博客网 时间:2024/05/09 05:06

中心法求最长回文子串

还有一个更简单的方法可以使用O(N^2)时间、不需要额外的空间求最长回文子串。我们知道回文字符串是以字符串中心对称的,如abba以及aba等。一个更好的办法是从中间开始判断,因为回文字符串以字符串中心对称。一个长度为N的字符串可能的对称中心有2N-1个,至于这里为什么是2N-1而不是N个,是因为可能对称的点可能是两个字符之间,比如abba的对称点就是第一个字母b和第二个字母b的中间。因此可以依次对2N-1个中心点进行判断,求出最长的回文字符串即可。根据该思路可以写出下面的代码。

[cpp] view plaincopy
  1. string expandAroundCenter(string s,int L, int r)  
  2. {  
  3.     int n = s.length();  
  4.     while (L>=0 && r<=n-1 && s[L]==s[r]) {  
  5.        L--; r++;  
  6.     }  
  7.     return s.substr(L+1, r-L-1);  //返回以L+1为起点长度为r-L-1的字符串
  8. }  
  9.   
  10. string longestPalindrome3(string s)  
  11. {  
  12.     int n = s.length();  
  13.     if (n == 0) return "";  
  14.     string longest = s.substr(0, 1);  
  15.     for (int i=0; i<n; i++) {  
  16.         string p1 = expandAroundCenter(s, i, i); 
  17. //以位置i为中心的最长回文字符串考虑字符串长度为奇数的情况
  18.         if (p1.length() > longest.length())  
  19.             longest = p1;  
  20.   
  21.         string p2 = expandAroundCenter(s, i, i+1);
  22.  //以i和i+1之间的位置为中心的最长回文字符串考虑字符串长度为偶数的情况
  23.         if (p2.length() > longest.length())  
  24.             longest = p2;  
  25.     }  
  26.     return longest;  
  27. }  
0 0
原创粉丝点击