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
题意:
求一个字符串的最长回文子串,输出其长度
思路:
DP:典型最长回文子串问题
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1010;
string str;
int dp[maxn][maxn];
int main(){
getline(cin, str);
int len = str.length();
int ans = 1;
memset(dp, 0, sizeof(dp));
//边界
for(int i = 0; i < len; i++){
dp[i][i] = 1;
if(i < len - 1){
if(str[i] == str[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(str[i] == str[j] && dp[i + 1][j - 1] == 1){
dp[i][j] = 1;
ans = L;
}
}
}
cout << ans << endl;
return 0;
}