给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母(大写和/或小写)组成
思路
采用中心拓展法,中心可能是单个字符,也可能是两个字符,所以要分两种情况,取它们的最大值
实现代码
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() <= 1)
return s;
int maxLen = 1,start = 0;
for(int i = 0; i < s.size();i++){ //对每个字符中心拓展
int len = Find(s,i);
if(maxLen < len){
maxLen = len;
start = i - (maxLen - 1) / 2;
}
}
return s.substr(start,maxLen);
}
int Find(string& s, int c) {
int l,r;
for(l = c,r = c;r < s.size()&&l >= 0&&s[l]==s[r];l--,r++); //中心为单个字符
int len1 = r - l -1;
for(l = c,r = c + 1;r < s.size()&&l >= 0&&s[l]==s[r];l--,r++); //中心为两个字符
int len2 = r - l -1;
return max(len1,len2);
}
};