给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
- 1 < = s . l e n g t h < = 1000 1 <= s.length <= 1000 1<=s.length<=1000
- s 仅由数字和英文字母组成 s 仅由数字和英文字母组成 s仅由数字和英文字母组成
题解
双指针
O
(
n
2
)
O(n^{2})
O(n2)
- 枚举数组中的每个位置
i
,从当前位置开始向两边扩散 - 当回文子串的长度是奇数时,从
i - 1
,i + 1
开始往两边扩散 - 当回文子串的长度是偶数时,从
i
,i + 1
开始往两边扩散 - 找到以
i
为中心的最长回文子串的长度,若存在回文子串比以前的长,则更新答案。
图示
代码
class Solution {
public:
string longestPalindrome(string s) {
string res;
for(int i = 0;i < s.size();i++)
{
回文串长度为奇数
int l = i - 1,r = i + 1;
while(l >=0 && r < s.size() && s[l] == s[r]) l--,r++;
if(res.size() < r - l - 1) res = s.substr(l + 1,r - l -1);
回文串长度为偶数
l = i,r = i + 1;
while(l >=0 && r < s.size() && s[l] == s[r]) l--,r++;
if(res.size() < r - l - 1) res = s.substr(l + 1,r - l -1);
}
return res;
}
};