您的位置:首页 > 其它

回文问题汇总

2015-06-29 20:59 447 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: