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.
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
题目分析
1. 最初想法
一个对称的串,与它的翻转是相同的。那么,最长的对称子串就是其与其翻转的最长公共部分,用最长公共子串来做就好了。
然而这是一个错误的方法(虽然可以通过)。由于最长公共的部分不一定是原先的部分的翻转,这里会出现过长的错误答案。举个栗子,串"abcdba"
,"ab"
会与翻转后的"ba"
错误的匹配,这并不是我们想要的。
那么怎么解决呢?其实也很简单,对于得到的最长匹配做一下检查,判断是不是对称的就好。
2. 从中心向两侧扩展
对称子串的中心想两侧伸展,可以求得以这个为中心的最长对称子串。那么,对于所有中心进行一次遍历,那么就可以实现求得最长对称子串的方法。中心的数量是 2n−1 ,这里要注意到,对称子串的中心,可能是字符(对应的子串长度为奇数),也可以是字符的间隔部分(对应的子串长度为偶数)。代码如下:
string longestPalindrome(string s) {
int start = 0, end = 0;
for (int i = 0; i < s.size(); i++) {
// 中间是字符
int k = i, j = i;
while (j >= 0 && k < s.size() && s[k] == s[j]) j--, k++;
// 中间是字符间隔
int len = k - j - 1;
k = i + 1, j = i;
while (j >= 0 && k < s.size() && s[k] == s[j]) j--, k++;
len = std::max<int>(len, k - j - 1);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2 + 1;
}
}
return s.substr(start, end - start);
}
3. 马拉车算法
从网上查得最优算法是马拉车算法,日后再更新吧