leetcode--5--最长回文串

 

原题:Longest Palindromic Substring 

 

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

解答:

C++版本

 string longestPalindrome(string s) {
    if (s.empty()) return "";
    if (s.size() == 1) return s;
    int min_start = 0, max_len = 1;
    for (int i = 0; i < s.size();) {
      if (s.size() - i <= max_len / 2) break;
      int j = i, k = i;
      while (k < s.size()-1 && s[k+1] == s[k]) ++k; // Skip duplicate characters.
      i = k+1;
      while (k < s.size()-1 && j > 0 && s[k + 1] == s[j - 1]) { ++k; --j; } // Expand.
      int new_len = k - j + 1;
      if (new_len > max_len) { min_start = j; max_len = new_len; }
    }
    return s.substr(min_start, max_len);
}


 

思路:

对于每个中心字母,存在两种情况

1:回文串长度为奇数, 例如:sdddssbdbs

2回文串长度为偶数, 例如:sdds sbddddbs

上述两种情况,对称中心的字母多是重复了几次,我们可以跳过这种重复,从不重复的地方开始比较,比如对于sddss[i] = d时,跳过重复,s[j] = d,比较s[k + 1] == s[j - 1],直到不相等。

遍历每个字母,找到以该字母为中心字母的回文长度,更新较大者。

 

注意:

1i = k+1,很有优势,因为重复的字母没必要再遍历第一次,比如fasdddsac的中间串,当中心字母为d(第一个d)时,以及可以确定回文是asdddsa,就没必要再遍历第二、第三个d,因为重复了,中心元素都是d,得到的回文串长度时一样的,所有没比较比较。

2if (s.size() - i <= max_len / 2) break,提前跳出循环,因为后面再计较,长度也不可能超过目前的最大长度。

 

 

 

 

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值