分析:
1.通过枚举的话,遍历起点终点时间复杂度O(n^2),判断是不是回文串O(n),总共是
O(n^3)
2.动态规划仅需O(n^2),最后通过枚举子串长度和起点来获取最大长度
3.动态规划求解时,也可以解决大问题的一个小问题。
代码:
#include<iostream>
#include<string>
using namespace std;
int ret[1010][1010];
int main()
{
string s;
getline(cin,s);
fill(ret[0],ret[0]+1010*1010,0);
int k = s.length();
int max = 1;
for (int i = 0; i < k; i++)
{
ret[i][i] = 1; //长度为1的所有回文串
if (i < k - 1)
{
if (s[i] == s[i + 1])
{
ret[i][i + 1] = 2;
max = 2;
}
}
}
//状态转移方程
for (int L = 3; L <=k;L++)
for (int i = 0; i+L-1<k; i++)
{
int j = i + L - 1;
if (s[i] == s[j] && ret[i + 1][j - 1]!=0)
{
ret[i][j] = L;
max = L;
}
}
cout << max;
return 0;
}