[LeetCode系列] 最长回文子串问题
2024-09-23 18:03:23
给定字符串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法: 线性时间解法, 比较复杂, 戳.
最新文章
- 深入理解Java中的String
- 常用Oracle函数记录
- asp.net 运行时,";未能映射路径";
- Windows中杀死占用某个端口的进程
- VNC与Windows之间的复制粘贴
- HTML5 测验记录
- Eclipse常用设置(转)
- scrapy学习记录
- power designer
- svn 设置钩子将代码同步到web目录下面
- mybatis中使用log4j
- [css 揭秘]:CSS揭秘 技巧(三):背景定位
- 数据结构学习:KMP模式匹配算法
- linux lvm管理扩展 RAID磁盘阵列管理
- 插件占坑,四大组件动态注册前奏(三) 系统BroadCast的注册发送流程
- [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists
- 项目总结01:JSP mysql SpringMvc下中国省市县三级联动下拉框
- spring下Junit_jdbc回滚demo
- Shell(6): 多线程操作及线程数
- 配置postgres9.3间的fdw——实现不同postgres数据库间的互访问
热门文章
- Linux /python --- zipinfo命令
- bzoj1622 / P2908 [USACO08OPEN]文字的力量Word Power
- Java第一周学习总结5311
- 学习Zookeeper之第2章Zookeeper安装
- Intellij IDEA 创建控制台项目,断点调试快捷方式
- 谈谈java中对象的深拷贝与浅拷贝
- Python学习札记(二十九) 模块2
- API设计原则(觉得太合适,转发做记录)
- Spring MVC文件上传教程 commons-io/commons-uploadfile
- WPF——RenderTransform特效