一、题目:
给你一个字符串 s
,找到 s
中最长的 回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
二、分析:
本次算法的核心思路是中心扩展法。
对于字符串或者数组来说,取出其中的一部分其实只需要知道下标就可以了。而回文子串也可以利用这一个技巧点,如果知道子串的起始下标和终止下标那就可以在原来的字符串上面进行截取。
将字符串的每一个元素进行遍历,向两边扩散返回以每一个字符串为中心的最大回文子串的长度,并且当长度比记录的更长时要及时更新起始点和终止点的下标。
三、代码:
class Solution {
public:
string longestPalindrome(string s) {
if (s.empty()) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); ++i) {
int len1 = expandAroundCenter(s, i, i); // 奇数长度的回文串
int len2 = expandAroundCenter(s, i, i + 1); // 偶数长度的回文串
int len = max(len1, len2);
//如果新返回的子串长度大于原来的长度,更新下标
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
//将字符串的每一个元素遍历完后得到最大字串的起始点下标和终止点下标,利用子串函数进行返回
return s.substr(start, end - start + 1);
}
private:
int expandAroundCenter(const string& s, int left, int right) {
while (left >= 0 && right < s.length() && s[left] == s[right]) {
--left;
++right;
}
//返回子串的大小
return right - left - 1;
}
};