[Leetcode 5] Longest Palindromic Substring
1. Description : Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
2. 题意:找出最长回文子串
思路一:取可能的中心点作为回文串中心向两遍拓展,找到最长回文子串(0ms)
证明:若当前需要判断的最长回文串中心为si,且满足si-1≠si=si+1=……=sj≠sj+1,则回文串中心应在si和sj的中心点/中心对。
证明如下(只证si…sj长度为奇数的情况):
- 当回文串中心在si和sj的中心点s(i+j)/2,最长回文串长度至少为j-i+1;
- 单中心点情况:若在其他位置,假设为sk且i≤k<(i+j)/2,则i+1≤2k-i+1<j+1,则s2*k-i+1=sk≠si-1,此时最长回文串长度为2(k-i)+1<j-i+1;同理(i+j)/2<k≤j的情况下最长回文串长度为2*(j-k)+1<j-i+1;
- 双中心点情况(j-i+1>1):假设为sk,sk+1且i≤k≤(i+j)/2-1, i+2≤2k-i+2≤j,则s2*k-i+2=sk≠si-1,最长回文串长度为2k-2i+2≤j-i<j-i+1;同理(i+j)/2≤k≤j-1的情况下最长回文串长度为2(j-k)≤j-i<j-i+1;
- 综上所述,当最长回文串中心必不在除si和sj的中心点s(i+j)/2之外的点上,si…sj长度为偶数的情况同理。
解法:根据上述证明,我们只需检查形如 si-1≠si=si+1=……=sj≠sj+1 的中心点s(i+j)/2(j-i+1为奇数)或(s(i+j-1)/2,s(i+j+1)/2)(j-i+1为偶数)的最长回文子串的长度,并记录即得到答案。
class Solution {
public:
string longestPalindrome(string &s) {
if(s.size() < 2) return s;
int max_left = 0, max_len = 1;
int l, r, start = 0, len = s.size();
while(start < len){
l = r = start;
while(r < len - 1 && s[r+1] == s[r]) r++;
start = r + 1;
while(l > 0 && r < len - 1 && s[l-1] == s[r+1]){
l--;
r++;
}
if(r - l + 1 > max_len){
max_left = l;
max_len = r - l + 1;
}
}
return s.substr(max_left, max_len);
}
};
思路二: DP(4ms)