由于是回文子串问题,首先要思考怎么进行回文字串问题的处理
- 子串:连续的
- 子序列:不连续的
对于子串可以采用类似子序列的方法
边界处理不太一样
初始化:全部为false
边界:len==1 设置为true len==2且s[i]==s[j],dp[i][j]=true
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5010;
bool dp[2*N][2*N];
int main()
{
string s;
cin >> s;
int n = s.size();
s = s + s;
int res = 0;
for (int len = 1;len <= n;len++)
for (int i = 0;i + len - 1 < 2 * n;i++)
{
int j = i + len - 1;
if (len == 1)
dp[i][j] = true;
else if (len == 2 && s[i] == s[j])
dp[i][j] = true;
else
{
if (s[i] == s[j])
dp[i][j]|=dp[i+1][j-1];
}
if (dp[i][j])
res = max(res, len);
}
cout << res;
}