题目描述:
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
思路:
核心是双指针,从中间开始向两边扩散来判断回文串。
这里需要注意的地方是:回文串的长度可能是奇数或者偶数,所以要考虑完全。
时间复杂度为 O(n^2)
空间复杂度为O(1)
class Solution {
public:
string palindrome(string &s, int low, int high)
{
while(low>=0 && high<s.size() && s[low]==s[high])
{
--low;
++high;//向两边展开
}
return s.substr(low+1,high-low-1);//返回回文串,substr(起始地址,长度)
}
string longestPalindrome(string s) {
string res;
for(int i=0; i<s.size(); ++i)
{
//计算以s[i]为中心的最长回文字串
string s1 = palindrome(s,i,i);
//计算以s[i]和s[i+1]为中心的最长回文子串
string s2 = palindrome(s,i,i+1);
res = res.size() > s1.size()? res: s1;
res = res.size() > s2.size()? res: s2;
}
return res;
}
};