1最长回文子串
O(n^2)
枚举中心法
def longestPal(s):
def help(l, r):
k = 0
while l - k >= 0 and r + k < len(s) and s[l - k] == s[r + k]: k += 1
return k * 2
maxLen = 0
for i in xrange(len(s)):
maxLen = max(maxLen, help(i, i) - 1)
maxLen = max(maxLen, help(i, i + 1))
return maxLen
DP
O(n) Manacher算法
2 最小割:最少割多少下,把字符串切割成全都是回文子串
DP
3 最少插入几个字符把原字符串变成一个回文串
1)只插前面
2)前后都可以插
3)任意位置可以插 DP O(n^2)
#include <iostream>
#include <climits>
using namespace std;
const int MAXN = 1001;
int f[MAXN][MAXN];
string s;
int dp(int l, int r)
{
if (l >= r) return 0;
int & x = f[l][r];
if (x != -1) return x;
x = INT_MAX;
if (s[l] == s[r]) x = min(x, dp(l + 1, r - 1));
x = min(x, min(dp(l, r - 1), dp(l + 1, r)) + 1);
return x;
}
int main()
{
memset(f, 0xff, sizeof(f));
cin >> s;
cout << dp(0, s.size() - 1) << endl;
}