给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
暴力枚举法超时,采用中心扩展法
class Solution {
public:
string longestPalindrome(string s) {
int len=s.size();
if(len==0||len==1)
return s;
int start=0;//记录回文子串起始位置
int end=0;//记录回文子串终止位置
int mlen=0;//记录最大回文子串的长度
for(int i=0;i<len;i++)
{
int len1=expendaroundcenter(s,i,i);//一个元素为中心
int len2=expendaroundcenter(s,i,i+1);//两个元素为中心
mlen=max(max(len1,len2),mlen);
if(mlen>end-start+1)
{
start=i-(mlen-1)/2;
end=i+mlen/2;
}
}
return s.substr(start,mlen);
//该函数的意思是获取从start开始长度为mlen长度的字符串
}
private:
int expendaroundcenter(string s,int left,int right)
//计算以left和right为中心的回文串长度
{
int L=left;
int R=right;
while(L>=0 && R<s.length() && s[R]==s[L])
{
L--;
R++;
}
return R-L-1;
}
};
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
if(len==1) return s;
else if(len == 2)
{
if(s[0]==s[1]) return s;
else
{
string s1 = {s[0]};
return s1;
}
}
else
{
int maxlen = 0;
int start = 0;
int end = 0;
for(int i = 1; i < len; i++)
{
int len1 = onecore(s,len,i-1,i+1);
int len2 = onecore(s,len,i-1,i);
//计算出了最长的长度
maxlen=(max(len1,len2)>maxlen)? max(len1,len2):maxlen;
//计算起始位置 每次更新起始和结束位置
if(maxlen>(end-start+1))
{
start = i - (maxlen)/2;
end = i + (maxlen-1)/2;
}
}
return s.substr(start,maxlen);
}
}
private:
int onecore (string s, int slen ,int left, int right)
{
int len = 1;
while(left>=0 && right<=slen-1)
{
if((s[left]==s[right])&&(right-left==1))//用来判断是否是采用两个字符做中心
{
left--;
right++;
len+=1;
}
else if(s[left]==s[right])//找到中心后往两边扩展
{
left--;
right++;
len+=2;
}
else
{
break;
}
}
return len;
}
};