Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
AC代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
char s[maxn];
int dp[maxn][maxn]; //为1表示是对称子串
int main(){
cin.getline(s, maxn);
memset(dp, 0, sizeof(dp));
int n = strlen(s);
//边界
for(int i = 0; i < n; i++){
dp[i][i] = 1;
if(i < n - 1)
if(s[i] == s[i + 1])
dp[i][i + 1] = 1;
}
int len = 1;
//状态转移方程
for(int L = 3; L <= n; L++){
for(int i = 0; i + L - 1 < n; i++){
int j = i + L - 1;
if(s[i] == s[j] && dp[i + 1][j - 1] == 1){
dp[i][j] = 1;
len = L;
}
}
}
cout<<len<<endl;
return 0;
}