传送门
题意
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路
关于这道题可以有很多的做法,可以暴力,也有个算法叫马拉车算法,这里主要介绍一下dp解法,
×第一,对于每一个字符都是一个回文串
×第二
我们用dp[i][j]代表字符串区间从i到j的子串是不是回文串,如果是回文串,那么dp[i][j]=1,反之为0
可以发现,如果str[i]==str[j]的时候,如果dp[i+1][j-1]=1,那么dp[i][j]=1;
另外如果str[i]==str[j],且j-i+1==2(也就是字符串长度为2的时候),那么dp[i][j]也等于1
这里要注意c++的读入是要用getline();
code
#include <iostream>
#include <string>
using namespace std;
int const maxn=1005;
int f[maxn][maxn];
int solve(string a)
{
int len=a.size();
int ans=1;
for(int j=0;j<len;j++)
{
int i=0;
f[j][j]=1;
for(;i<j;i++)
{
f[i][j]=(a[j]==a[i]&&(j-i<2||j>0&&f[i+1][j-1]));
if(f[i][j])
{
ans=max(ans,j-i+1);
}
}}
cout<<ans<<endl;
return 0;
}
int main()
{
string a;
getline(cin,a);
solve(a);
return 0;
}