题意:
给定一个字符串,输出最长回文子串的长度。
方法一:
中心拓展法
思路:遍历,以字符串的每个字符作为中心,向左右两边拓展,寻找最长回文子串的长度。
分为两种情况:
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; }
时间复杂度:空间复杂度: