题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:输入: "cbbd"
输出: "bb"来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
中心扩展法
class Solution {
public:
string longestPalindrome(string s) {
int length=s.size();
if(length==0 || length==1)
return s;
int start=0; //记录回文开始位子
int end=0; //回文结束位子
int maxlen=0; //回文长度
for(int i=0;i<length;i++)
{
int len1=expendCenter(s,i,i); //当回文是以一个为中心时(例如 aba)
int len2=expendCenter(s,i,i+1); //当回文是以两个为中心时(例如 abba)
maxlen=max(max(len1,len2),maxlen);
if(maxlen>end-start+1)
{
start=i-(maxlen-1)/2; //当一个为中心时都为maxlen/2是没问题的
end=i+maxlen/2; //但是两个时,i的位置并不是在真正的对称位置
} //可以用马拉车算法的思想来理解(#a#b#b#a#),这里可
//以看出中心位置为#,而i在第一个b位置。
}
return s.substr(start,maxlen);
}
private:
int expendCenter(string& s,int left, int right)
{
int L=left;
int R=right;
while(L>=0 && R<s.length() && s[L]==s[R])
{
L--;
R++;
}
return R-L-1;
}
};