回文问题汇总
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)
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; }
相关文章推荐
- Wireshark 抓包---诊断数据库
- fatal error C1083: Cannot open include file: 'SDKDDKVer.h': No such file or directory
- struts2 CVE-2010-1870 S2-005 XWork ParameterInterceptors bypass allows remote command execution
- 中国学者学术报告之不好习惯
- 视觉直观感受 7 种常用的排序算法
- 使用BlockingQueue进行线程间通信(java)
- mongo笔记之监控
- 为button设置背景图片,且全无button痕迹的css
- DNS
- URL中加入BASE64加密的字符串引起的问题(java.net.MalformedURLException:Illegal character in URL)
- LeetCode_Linked List_Merge Two Sorted Lists
- TCP/IP数据包结构详解
- 8款肉菜的做法集锦
- shell学习之路:流程控制(if)
- unity3d射线控制移动
- UITableViewCell的separatorInset属性
- Java------基础知识
- 常见排序算法小结
- 5.18~5.19
- Java基础---网络编程