5. 最长回文子串
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
class Solution {
public:
string init_str(string s){
string ss;
ss+='$';
for(int i = 0;i < s.size();i++){
ss+='#';
ss+=s[i];
}
ss+='#';
return ss;
}
string longestPalindrome(string s) {
string ss = init_str(s);
vector<int>len(ss.size());
int ansi = -1,ans = 0,p = 0,mr = 0;
for(int i = 1;i < ss.size();i++){
if(i < mr) len[i] = min(len[2 * p - i],mr - i);
else len[i] = 1;
while(ss[i - len[i]] == ss[i + len[i]]) len[i]++;
if(i + len[i] > mr){
mr = i + len[i];
p = i;
}
ansi = (ans <= len[i]) ? i : ansi;
ans = max(ans,len[i]);
}
string ans_str;
for(int i = ansi - len[ansi] + 1;i < ansi + len[ansi];i++)
if(ss[i] != '#') ans_str += ss[i];
return ans_str;
}
};
解题思路:manancher算法。具体manancher算法解析有时间再写了。