题目描述
给定一个字符串,返回它的最长回文子串。如果存在多个答案,返回任意一个即可。字符串长度 $\leq$ 1000。
样例1
输入:"babad"
输出:"bab"
注意:"aba" 也是一个合法的答案.
样例2
输入:"cbbd"
输出:"bb"
算法
(暴力枚举) $O(n^2)$
由于字符串长度小于1000,因此我们可以用 $O(n^2)$ 的算法枚举所有可能的情况。
首先枚举回文串的中心 $i$,然后分两种情况向两边扩展边界,直到遇到不同字符为止:
- 回文串长度是奇数,则依次判断 $s[i-k] == s[i+k], k = 1, 2, 3, … $
- 回文串长度是偶数,则依次判断 $s[i-k] == s[i+k-1], k = 1, 2, 3, …$
如果遇到不同字符,则我们就找到了以 $i$ 为中心的回文串边界。
时间复杂度分析:一共两重循环,所以时间复杂度是 $O(n^2)$。
C++ 代码
class Solution {
public:
string longestPalindrome(string s) {
int res = 0;
string str;
for (int i = 0; i < s.size(); i ++ )
{
for (int j = 0; i - j >= 0 && i + j < s.size(); j ++ )
if (s[i - j] == s[i + j])
{
if (j * 2 + 1 > res)
{
res = j * 2 + 1;
str = s.substr(i - j, j * 2 + 1);
}
}
else break;
for (int j = i, k = i + 1; j >= 0 && k < s.size(); j -- , k ++ )
if (s[j] == s[k])
{
if (k - j + 1 > res)
{
res = k - j + 1;
str = s.substr(j, k - j + 1);
}
}
else break;
}
return str;
}
};
dp可以吗
可以区间dp
面试中大家最好写个sub function. 面试很看coding style。
这是新鲜的面经么
大佬,这句话不太理解。
子函数封装
想问一下为什么奇数偶数放在一个循环里面呢- -
老师这个题可以 用字符串哈希加上二分来做吗?
可以
这道题只有暴力求解吗, 有没有办法模拟KMP,把寻找情况记录下来作为下一次寻找的参考
有个类似于KMP的时间复杂度是 $O(n)$ 的算法——Manacher算法。不过这个算法比较偏,基本上只能用来求最长回文子串了,所以平时基本不会用到。
所以请问是不是 就没有必要学习呢
是的
O(n*n)。对于每一个字符,以之作为中间元素往左右寻找。
注意处理奇偶两种模式:
1. aba
2. abba
对的,没错!
6666666666666666666666666