最长回文子串
问题描述
给出一个字符串S,求S的最长回文子串的长度
样例输入
PATZJUJZTACCBCC
样例输出
9
dp[i][j]表示s[i]至s[j]所表示的子串是否是回文子串,是则为1,不是则为0
动态转移方程:
当s[i] == s[j]时,dp[i][j] = dp[i+1][j-1]
当s[i] != s[j]时,dp[i][j] = 0
#include <bits/stdc++.h>
using namespace std;
int main()
{
const int maxn=1000;
string S;//A存序列,dp[i]存以i为结尾的连续序列的最大和
int dp[maxn][maxn];
getline(cin, S);//从下标为1开始读入
int len=strlen(S),ans=1;
memset(dp,0,sizeof(dp));
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++)//枚举子串起始端点 起始端点加上子串长度(子串长度包括他
本身,所以要-1)必须小于总长,
{
int j=i+L-1;//子串右端点
if(S[i]==S[j]&&dp[i+1][j-1]==1)
{
dp[i][j]=1;
ans=L;//更新最长回文子串长度;
}
}
cout<<ans<<endl;
}