文字列が与えられると、最も長い対称部分文字列の長さを出力することになっています。たとえば、Is PAT&TAP symmetric?の場合、最長の対称部分文字列はs PAT&TAPであるため、11を出力する必要があります。
入力仕様:
各入力ファイルには、1000以下の長さの空でない文字列を与える1つのテストケースが含まれています。
出力仕様:
各テストケースについて、最大長を1行に印刷するだけです。
サンプル入力:
Is PAT&TAP symmetric?
サンプル出力:
11
これはテンプレート質問
ACコードです:
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
char s[N];
int dp[N][N];//存的是i到j是否为回文串 而不是回文串长度
//思想是:如果dp[i][j] = 1 就去检查dp[i+1][j-1] 如果还是回文串耐久继续检查
//倘若不检查过程中存在不满足的那就不是回文串
int main()
{
fgets(s, N, stdin);
int ans = 1;
int len = strlen(s);
//先初始化边界
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)//一点一点向外扩充 字符串长度为2的已经在初始化的时候判断成功
{
dp[i][j] = 1;
ans = L; //更新最长回文字串长度
}
}
}
cout << ans << endl;
return 0;
}