最长回文子串

中心法求最长回文子串

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

[cpp]  view plain copy
  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值