给定字符串S, 找到其子串中最长的回文字符串.
 

反转法: 反转S为S', 找到其中的最长公共子串s, 并确认子串s在S中的下标iS与在S'中的下标iS'是否满足式: length(S) = iS + iS' + length(s). 如果满足则s为搜索结果, 如果不满足我们就继续搜索.

 
DP解法:
定义 P[i][j] = true  <-> Si...Sj是回文串, 否则为false;
则有 P[i+1][j-1] = true && Si = Sj <-> P[i][j] = true;
基本的情况则是 P[i][i] = true 以及 P[i][i+1] = (Si == Si+1)
从而我们可以在平方时间内构造和搜索完成, 并使用平方的空间.
 
 class Solution {
public:
string longestPalindrome(string s) {
if (s.length() <= ) return s;
// DP solution
bool P[][] = {false};
int start = ;
int maxLen = ;
for (int i = ; i < s.length(); i++) {
P[i][i] = true;
}
for (int i = ; i < s.length() - ; i++) {
if (s[i] == s[i+]) {
P[i][i+] = true;
start = i;
maxLen = ;
}
}
for (int len = ; len <= s.length(); len++) {
for (int i = ; i < s.length() - len + ; i++) {
int j = i + len - ;
if (s[j] == s[i] && P[i+][j-]) {
P[i][j] = true;
start = i;
maxLen = len;
}
}
}
return s.substr(start, maxLen);
}
};
 
中心法:
一个回文总是以某个字符为中心展开的, 这样的中心共有2N-1个(包括2个字符中间的"空白").
考虑到从中心开始拓展回文字符需要消耗O(N)次, 所以总的时间复杂度是O(N2).
 class Solution {
public:
string longestPalindrome(string s) {
if (s.length() <= ) return s;
string longest = s.substr(, );
// Center Solution
for (int i = ; i < s.length() - ; i++) {
string res = expandFromCenter(s, i, i);
if (res.length() > longest.length()) longest = res;
res = expandFromCenter(s, i, i+);
if (res.length() > longest.length()) longest = res;
}
return longest;
} string expandFromCenter(string s, int l, int r) {
while (l >= && r < s.length() && s[l] == s[r]) {
l--;
r++;
}
return s.substr(l+, r-l-);
}
};

Manacher法: 线性时间解法, 比较复杂, .

最新文章

  1. 深入理解Java中的String
  2. 常用Oracle函数记录
  3. asp.net 运行时,&quot;未能映射路径&quot;
  4. Windows中杀死占用某个端口的进程
  5. VNC与Windows之间的复制粘贴
  6. HTML5 测验记录
  7. Eclipse常用设置(转)
  8. scrapy学习记录
  9. power designer
  10. svn 设置钩子将代码同步到web目录下面
  11. mybatis中使用log4j
  12. [css 揭秘]:CSS揭秘 技巧(三):背景定位
  13. 数据结构学习:KMP模式匹配算法
  14. linux lvm管理扩展 RAID磁盘阵列管理
  15. 插件占坑,四大组件动态注册前奏(三) 系统BroadCast的注册发送流程
  16. [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists
  17. 项目总结01:JSP mysql SpringMvc下中国省市县三级联动下拉框
  18. spring下Junit_jdbc回滚demo
  19. Shell(6): 多线程操作及线程数
  20. 配置postgres9.3间的fdw——实现不同postgres数据库间的互访问

热门文章

  1. Linux /python --- zipinfo命令
  2. bzoj1622 / P2908 [USACO08OPEN]文字的力量Word Power
  3. Java第一周学习总结5311
  4. 学习Zookeeper之第2章Zookeeper安装
  5. Intellij IDEA 创建控制台项目,断点调试快捷方式
  6. 谈谈java中对象的深拷贝与浅拷贝
  7. Python学习札记(二十九) 模块2
  8. API设计原则(觉得太合适,转发做记录)
  9. Spring MVC文件上传教程 commons-io/commons-uploadfile
  10. WPF——RenderTransform特效