题意:
给定一个字符串,输出最长回文子串的长度。
方法一:
中心拓展法
思路:遍历,以字符串的每个字符作为中心,向左右两边拓展,寻找最长回文子串的长度。
分为两种情况:
1)以s[i]作为中心
2)先判断s[i-1]==s[i],如果相等,s[i-1]和s[i]作为中心
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
int len=s.size();
int res=0;
for(int i=0;i<len;i++){//遍历,以s[i]为中心向两边拓展
int j=i-1,k=i+1;//以s[i]作为中心
while(j>=0&&k<len){
if(s[j]!=s[k])
break;
j--;
k++;
}
res=max(res,k-j-1);
if(i-1>=0&&s[i-1]==s[i]){//先判断s[i-1]==s[i],如果相等,s[i-1]和s[i]作为中心
j=i-2;
k=i+1;
while(j>=0&&k<len){
if(s[j]!=s[k])
break;
j--;
k++;
}
res=max(res,k-j-1);
}
}
cout << res << endl;//输出维护的最大值
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
区间法
思路:二重循环得到区间的左右下标。
再判断这个区间是否为回文子串。
维护回文子串长度的最大值。
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
int len=s.size();
int res=1;//初始化最小值为1
for(int i=0;i<len;i++){//二重循环
for(int j=i+1;j<len;j++){
int l=i,r=j;//得到区间的左右下标
while(l<r){
if(s[l]!=s[r]){//如果不相等,则退出
break;
}
l++;
r--;
}
if(l>=r){
res=max(res,j-i+1);//维护最大值
}
}
}
cout << res << endl;
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号