算法38 5. 最长回文子串
leetcode的提交不知道是不是有问题,我写的在本地跑起来比官方答案快,但是提交失败。
我的思路
正推,字符串首尾各放一指针,向中间查找相同项,找到后开始判断是否回文串,当两指针相遇判断结果,记录长度。并且第一个找到的回文串肯定是最大,所以前面的指针向前继续查找
string longestPalindrome(string s) {
int p,max;
p=0;//标记最长子串的指针
max=1;//记录最大值
for(int i=0;i<s.size()-1;i++){
for(int j=s.size()-1;j>i;j--){
bool q=0;//当找到回文串结束j循环
if(s[i]==s[j]){//找到回文串边界,开始判断
for(int y=i,z=j;z>=y;y++,z--){
if(s[y]!=s[z]) break;
if(y==z||y==z-1)//结束判断,记录大小
if(j-i+1>max){
p=i;
max=j-i+1;
q=1;
}
}
}
if(q) j=i;//找到回文串
}
}
return s.substr(p,max);
}
中心扩展法
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;
}
};