Leetcode#5 Longest Palindromic Substring

原题地址

 

以前可以用DP枚举所有回文串,但是Leetcode后来增加了几组大数据,用DP会超时。

什么!用DP都超时了??那怎么办?

答:二分法尝试可能的回文串长度,直到找到最大值

 

需要注意的是,假设现在已经验证了长度为length的回文串不存在,传统的二分法就会去尝试长度为length/2的回文串是否存在。但是!长度为length+1的回文串是可能存在的。例如:"aba",虽然长度为2的回文串不存在,但是长度为3的回文串是存在的。根本原因就是奇数回文串的存在性无法推出偶数回文串的存在性,反之也一样。

所以,需要对传统的二分法进行改进,每次把length和length-1都尝试一遍,这样就不会漏掉正确解了。

 

代码:

 1 bool palindromep(string &s, int i, int j) {
 2   while (i < j && s[i] == s[j]) {
 3     i++;
 4     j--;
 5   }
 6   return i >= j;
 7 }
 8 
 9 string longestPalindrome(string s) {
10   int l = 1;
11   int r = s.length();
12   int index = 0;
13   int length = 1;
14 
15   while (l <= r) {
16     int m = (l + r) / 2;
17     // 尝试长度为m-1的回文串是否存在
18     for (int i = 0; i + m - 1 <= s.length(); i++)
19       if (palindromep(s, i, i + m - 2)) {
20         index = i;
21         length = m - 1;
22         break;
23       }
24     // 尝试长度为m的回文串是否存在
25     for (int i = 0; i + m <= s.length(); i++)
26       if (palindromep(s, i, i + m - 1)) {
27         index = i;
28         length = m;
29         break;
30       }
31 
32     if (length == m || length == m - 1)
33       l = m + 1;
34     else
35       r = m - 2;
36   }
37 
38   return s.substr(index, length);
39 }

 

转载于:https://www.cnblogs.com/boring09/p/4246339.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值