最长回文子串的长度
dp[i][j]代表区间[i,j]形成的子串是否为回文串
dp回文串的长度
O(n^2)
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll n;
string s1,s2,s;
int dp[55][55];//代表从i到j的子串是不是回文串
int ac(string s)//最长回文子串的长度
{
memset(dp,0,sizeof(dp));
int len=s.size();
int ans;//回文串长度
for(int i=0;i<len;i++)//初始化
{
dp[i][i]=1;ans=1;
if(i<=len-2)
{
if(s[i]==s[i+1])
{
dp[i][i+1]=1;
ans=2;
}
}
}
for(int n=3;n<=len;n++)//dp区间长度
{
for(int i=0;i<=len-n;i++)//枚举区间左端点
{
int j=i+n-1;//右端点
if(s[i]==s[j])
{
dp[i][j]=dp[i+1][j-1];
if(dp[i][j])//当前长度为n的子串为回文串
{
ans=max(ans,n);//更新最长长度
}
}
else dp[i][j]=0;
}
}
return ans;
}
int main()
{
cin>>s;
cout<<ac(s)<<endl;
return 0;
}