条件 : 如果S【i】 到 S 【j】 是回文字符串,dp为1 否则为0
S【i】 == S 【j】并且S【i+1】到 S【j-1】也为回文字符串,那么S【i】 到S【j】 也为回文字符串。否则就不是。
然后就是怎么递推出答案,我们要求 dp[ i ][ j ] 必须要知道 dp[ i + 1] [ j - 1]
这就有意思了。往常的dp从 1 开始到len就不能用了。那我们就需要换种思维,找另一种递推的边界。
然后能根据边界推,这时边界就变成了长度为1, 2的回文字符串。这样我们可以推出来长度为3的回文字符串长度,然后4.。。。。一直到L
时间复杂度O(N^2).
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
char S[N];
int dp[N][N];
int main (){
gets(S);
int len = strlen(S), ans = 1;
memset (dp, 0, sizeof(dp));
for(int i = 0; i < len; i++){
dp[i][i] = 1;
if(i < len - 1){
if(S[i] == S[i + 1]){
dp[i][i + 1] = 1;
ans = 2;
}
}
}
for(int L = 3; L <= len; L++){
for(int i = 0; i + L - 1 < len; i++){
int j = i + L - 1;
if(S[i] == S[j] && dp[i + 1][j - 1] == 1){
dp[i][j] = 1;
ans = L;
}
}
}
printf("%d\n", ans);
return 0;
}