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 iss PAT&TAP s
, hence you must output11
.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
dp解决回文串问题。
使用子串长度L作为递增量,左边界i ,右边界i + L - 1,保证dp枚举顺序是合理的。
读入一行字符串 getline(cin, string)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
const int maxn = 1010;
string S;
char dp[maxn][maxn];
int main(){
//dp[i][j]表示i到j之间的元素是否是回文子串
getline(cin, S);
int len = S.length();
memset(dp, 0, sizeof(dp));
int max = 1;
for(int i = 0; i < len; i++){
dp[i][i] = 1;
if(i < len - 1 && S[i]==S[i + 1]){
dp[i][i+1] = 1;
max = 2; // important
}
}
for(int L = 3; L <= len; L++){
for(int i = 0; i + L - 1 < len; i++){
int j = L - 1 + i;
if(S[i] == S[j] && dp[i+1][j-1] == 1)
{
dp[i][j] = 1;
max = L;
}
}
}
cout<<max;
return 0;
}