中等
最长回文子串
回文串即从前往后读和从后往前读的结果是一致的,比如:abba
就是回文串,而abb
不是回文串。判断字符串s
中是否存在回文串,一种解决思路是,以某个字符为起点,向两边展开,如果需要求最长回文子串,只需要在每次求完后,比较长度即可。
但是由于回文子串的长度可能是奇数,也可能是偶数,因此,向起点可以是一个,也可以是相邻的两个字符。
// 以l,r两个字符为中心,求回文子串
string palindrome(string s, int l, int r) {
while(l >= 0 && r < s.size() && s[l] == s[r]) {
l--;
r++;
}
// s[l+1] - s[r - 1]中的字符串即回文子串
return s.substr(l + 1, r - l - 1);
}
// 求s中的最长回文子串
string longestPalindrome(string s) {
string res;
// 对每个字符,求回文子串
for (int i = 0; i < s.size(); i ++) {
string s1 = palindrome(s, i, i);
string s2 = palindrome(s, i, i + 1);
// 判断奇偶的情况
res = res.size() > s1.size() ? res : s1;
res = res.size() > s2.size() ? res : s2;
}
return res;
}