暴力方法O(n^3)
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int maxN = 1010;
bool isHuiWen(string temp){
int size = temp.size();
for(int i = 0; i < size / 2; i++){
if(temp[i] != temp[size-1-i]){
return false;
}
}
return true;
}
int main()
{
string str;
getline(cin, str);
int size = 0;
for(int i = 0; i < str.size(); i++){
for(int j = i; j < str.size(); j++){
string temp = str.substr(i, j - i + 1);
if(isHuiWen(temp)){
if(temp.size() > size){
size = temp.size();
}
}
}
}
cout << size << endl;
return 0;
}
动态规划O(n^2)
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxN = 1010;
int dp[maxN][maxN];
int main()
{
string str;
getline(cin, str);
int ans = 1;
int len = str.size();
for(int i = 0; i < len; i++){
dp[i][i] = 1;
if(i < len - 1){
if(str[i] == str[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++){
int j = i + L - 1;
if(str[i] == str[j] && dp[i+1][j-1] == 1){
dp[i][j] = 1;
ans = L;
}
}
}
cout << ans << endl;
return 0;
}
二分+字符串hash O(blogs)
Manacher O(n)