题目
C++ solution
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size(); // 字符串s的长度
if (len < 1)
{
return "";
}
int start = 0, maxlen = 0; // 记录子字符串的首字符在原字符串中的下标和回文子串的最大长度
// 遍历每个回文子串的中心点,中心有两种情况,一是单个字符,二是两个相同且相邻的字符
for (int i = 0; i < len; i++)
{
int len1 = lenWithGivenCenter(s, len, i, i);
int len2 = lenWithGivenCenter(s, len, i, i+1);
int longlen = len1 > len2 ? len1 : len2;
if (longlen > maxlen)
{
maxlen = longlen;
start = i - (maxlen - 1) / 2;
}
}
return s.substr(start, maxlen);
}
/*
* 计算由给定中心所得到的最长回文的长度
*/
int lenWithGivenCenter(string s, int len, int left, int right)
{
while(left >= 0 && right < len && s[left] == s[right])
{
left--;
right++;
}
return right - left - 1;
}
};
简要题解
回文串是指正反读都一样的字符串,即该字符串是对称的。所以回文串必有一个中心点,中心点有两种情况,一是单个字符,二是两个相同且相邻的字符。遍历给定字符串的所有可能中心点,计算每个中心点所得到的最长回文的长度,比较得到最长的回文子串。