最长回文子串
来源:互联网 发布:linux 777 什么权限 编辑:程序博客网 时间:2024/05/31 18:53
注意, substring和subsequence 是有区别的。substring属于subsequence, 但是subsequence 不一定是substring。
给定一个string T = str[0...n-1], 该字符串的一个子串substring就是截取连续的(包括全部)的一部分subT = [i, ...j], 其中, 0<= i and j <= n-1。 但是subsequence则是选择相关的字符, 保持其在原字符串中的相对顺序, 然后组成的新的string就是subsequence, 别混淆了。
最长回文子串(LPS)就是从给定的字符串中找出最长的一个子字符串, 这个子字符串从左往右读和从右往左读, 读出的结果是一样的。
例如:aba, a, abba均是回文子串。 在例如, S = "abcbcbb"的LPS 是“bcbcb”。
(方法一) bruteforce的办法: 最简单的办法就是价差字符串的每一个子字符串是否为palindrome or not。 我们可以运行三个loops, 外层两个loops 一个个的选择字符串所有可能的子字符串, 内层循环检查选的该子字符串是否是palindorme的。
运行结果如下:
分析: 时间复杂度: O(n^3)
辅助空间复杂度: O(1)
(方法二) 动态规划的办法: 我们maintain一个boolean的table[n][n], 然后自底向上的方式填充这个table。 如果子字符串str[i, j]是palindrome的 我们就把table[i][j]记为true, 否则就记为false。 为了计算table[i][j], 我们需要首先检查table[i+1][j-1], 如果table[i+1][j-1]是true的, 并且str[i]与str[j]是相同的字符, 我们就记录table[i][j]为true。否则table[i][j]就为false。 更详细的分析见下面:
如果substring(i, j)是palindromic的, 那么substring(i+1, j-1)也是palindromic的。
table[i][j]是palindromic的, 那么几位true。 otherwise, 记为0。
当j - i 比较小的时候, 即为0或者为1, 那么我们很容易知道:
table[i][i] = true, table[i][i+1] = (S[i] == S[j]), 这是base case。
另外, 还有table[i][j] = table[i + 1] [j - 1] && S[i]==S[j]。
table[i][i]如下:
table[i][i+1]如下:
table[i][i+2], table[i][i+3]等等如下:
程序如下:
运行结果如下:
分析: 时间复杂度: O(n^2)
辅助空间复杂度: O(n^2) (其实还可以改进的, 使得改进后的空间复杂度为O(n))
(方法三)Manacher 算法, 时间复杂度为O(n)。
虽然很屌, 太耗时间了。 有时间在研究。 you are not expected to think such a good algorithms。
(方法四): (利用最长公共子序列求解) LPS 就是str和str反转过来的LCS, 我们只需要找出这两个字符串的LCS即可。 这又归结为动态规划的内容了。
(方法五): 观察到一个palindrome 是关于center 成镜像的。 例如 ab|ba, a b a, 注意palindrome为偶数个字符的时候,中心在两个字符之间, 当palindrome的字符个数为奇数的时候, 中心是在最中间的那个字符。
对于一个具有N个字符的字符串, 共有2N - 1 个centers。 因为两个字符之间也可能是center,字符本身也可能是center, 所以是2N - 1。 所以我们只需要对每个中心进行expand的方式查找palindrome, 每个中心需要花费O(N), 所以这个方法的时间复杂度是O(N^2)。
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- java Object 全解析(未完待续)
- SQL语句的执行过程(以oracle为例)
- 字符串 和 模式匹配(python学习手册4)
- jquery jqGrid colModel 某一列添加超链接
- 将键盘录入的数据,通过打印流(PrintWriter)写入本项目下的aa.txt中
- 最长回文子串
- go语言学习----字符串、数组和切片的应用
- 想要访问google,这些方法可能对你有帮助
- Windows下C++软件调试——检测内存泄露
- 【Unity基础知识】——Unity图片Atlas-2DTextures属性
- 广告点击率平滑
- apache、nginx禁止访问文件或目录设置
- Servlet基础
- 状态栏3---ToolBar可折叠效果,添加监听