前面我们已经掌握了背向双指针的做法,接下来我们试一下动态规划做法
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
string s;
int a[2500][2500];
int main(int argc, char** argv) {
//基于动态规划的做法
while(cin>>s){
int len=s.length();
memset(a,0,sizeof(a));
for(int i=0;i<len;i++){
a[i][i]=1;
}
int longest=1;
for(int i=0;i<len-1;i++){
if(s[i]==s[i+1]){
a[i][i+1]=1;
longest=2;
}
}
for(int i=len-1;i>=0;i--){
for(int j=i+2;j<len;j++)
{
a[i][j]=a[i+1][j-1]&&(s[i]==s[j]);
if(a[i][j]==1&&(j-i+1)>longest)
longest=j-i+1;
}
}
cout<<longest<<endl;
}
return 0;
}
虽然和前者的时间复杂度相同,但是这种思路可以用在更多的题型