Day 1.13
最长回文子串
题目
思路(1)
class Solution {
public:
string longestPalindrome(string s) {
int c,m = 0,l = 0,j = 0,k = 0,g = 0;
string u;
for(int i = 0;s[i]!='\0';i++){
if(s[i]==s[i+1]){
c = 0;
for(j = i,k = i+1;j>=0&&s[k]!='\0';){
while(s[j]==s[k]){
c+=2;
j--;
k++;
}
break;
}
if(m<c){m=c;l=i;g=0;}
}
c = -1;
for(j = i,k = i;j>=0&&s[k]!='\0';){
while(s[j]==s[k]){
c+=2;
j--;
k++;
}
break;
}
if(m<c){m=c;l=i;g=1;}
}
if(g==0){
for(int i = l-m/2+1;i<=l+m/2;i++){
u+=s[i];
}
return u;
}else{
for(int i = l-m/2;i<=l+m/2;i++){
u+=s[i];
}
return u;
}
}
};
测试多组正确但部分输出有框
思路(2)(答案)
代码
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;
}
};
笔记
回文中心的两侧互为镜像。因此,回文可以从他的中心展开,并且只有 2n-1 个这样的中心(一个元素为中心的情况有 n 个,两个元素为中心的情况有 n-1 个)