-
题目5:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。示例 2:
输入: “cbbd”
输出: “bb”
看了答案,还是中心扩展法比较好理解
// C++完成
class Solution {
public:
string longestPalindrome(string s) {
if (s == "" || s.size()<1)
return "";
int start = 0;
int end = 0;
int max = 1;
for (int i = 0; i<s.size()-1; i++)
{
int len1 = expandAroundCenter(s, i, i);//奇数个回文的情况,中心在某个字符上
int len2 = expandAroundCenter(s, i, i + 1);//偶数个回文的情况,中心在某两个字符之间
int len = len1 >= len2 ? len1 : len2;
if (len>(end - start + 1))
{
if (len == len1)
{
start = i - (len - 1) / 2;
end = i + (len-1) / 2;
}
else
{
start = i + 1 - len / 2;
end = i + len / 2;
}
}
if (len > max)
max = len;
}
return s.substr(start, max );
}
int expandAroundCenter(string s, int left, int right)
{
int L = left;
int R = right;
while (L >= 1&& R<s.size()-1&&s[L]==s[R])
{
if (s[L-1] == s[R+1])
{
L--;
R++;
}
else break;
}
if (s[L] == s[R])
return R - L + 1;
else
return 0;
}
};