Leetcode:【DP】Longest Palindromic Substring 解题报告
Longest Palindromic Substring -- HARD 级别
Question SolutionGiven a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

经典的DP题目。
主页君给出3种解法:
1. Brute Force
这个非常Straight Forward,就是开始节点i从0-len-1遍历一次,结束结点以i - Len-1遍历一次。每个字符串都
判断它是不是回文,判断是不是回文也可以使用递归来做。总的复杂度是
Time:O(n^3), Space:O(1)
2. DP
DP 因为是二维动态规划
Time:O(n^2), Space:O(n^2)
public String longestPalindrome(String s) {
if (s == null) {
return null;
}
String ret = null;
int len = s.length();
int max = 0;
boolean[][] D = new boolean[len][len];
for (int j = 0; j < len; j++) {
for (int i = 0; i <= j; i++) {
D[i][j] = s.charAt(i) == s.charAt(j) && (j - i <= 2 || D[i + 1][j - 1]);
if (D[i][j]) {
if (j - i + 1 > max) {
max = j - i + 1;
ret = s.substring(i, j + 1);
}
}
}
}
return ret;
}
解说:
状态表达式:D[i][j] 表示i,j这2个索引之间的字符串是不是回文。
递推公式: D[i][j] = if ( char i == char j) && (D[i + 1][j - 1] || j - i <= 2)) 这个很好理解,跟递归是一个意思,只不过 动规的好处就是我们可以重复利用这些结果。
初始化:
D[i][i] = true;实际上也不用特别初始化,都可以套到递推公式里头。 所以主页君的代码会看起来很简单。
注意:用max记录回文长度,回文找到时,更新一下max,及结果的起始地址,结束地址。
现在重点来了,我们怎么设计这个动规才可以重复利用呢?
从这里可以看出D[i + 1][j - 1], 我们推i,j的时候用到了i+1, j-1,其实意思就是在计算i,j时,关于同一个j-1的所有的i必须要计算过。
画图如下:
1. 00
2. 00 01
11
3. 00 01 02
11 12
22
3. 00 01 02 03
11 12 13
22 23
33
看到上面的递推关系了吗?只要我们一列一列计算,就能够成功地利用这个动规公式。这也是动态规划的关键性设计所在。
如果你不知道如何设计,就和主页群一样,画一个图来看我们计算某值的时候,需要哪些已经有的值。如上图所示,我们需要的是i+1, j - 1,实际上就是左下角的值,这样的话我们只要一列一列计算,就能成功动态规划。
注意:一行一行计算就会失败!
所以我们的循环的设计是这样的:
for (int j = 0; j < len; j++)
{ for (int i = 0; i <= j; i++) {
具体请参见代码,慢慢感受一下。这个才是动规的精髓咯。
3. 中心展开法。
这个方法其实很直观,就是从头扫描到尾部,每一个字符以它为中心向2边扩展,扩展到不能扩展为止(有不同的字符),返回以每一个字符为中心的回文,然后不断更新最大回文并返回之。
算法简单,而且复杂度为O(n^2),空间复杂度为O(1)
推荐面试使用这一种方法。据说有的公司如EBAY会拒掉动规的解法. ORZ.. 其实主页君比较心水第二种解法啊,多优美,第三种解法虽然消耗更少,但没有什么普适性。
public class Solution {
public String longestPalindrome(String s) {
if (s == null) {
return null;
}
String ret = null;
int len = s.length();
int max = 0;
for (int i = 0; i < len; i++) {
String s1 = getLongest(s, i, i);
String s2 = getLongest(s, i, i + 1);
if (s1.length() > max) {
max = Math.max(max, s1.length());
ret = s1;
}
if (s2.length() > max) {
max = Math.max(max, s2.length());
ret = s2;
}
}
return ret;
}
public String getLongest(String s, int left, int right) {
int len = s.length();
while (left >= 0 && right < len) {
// when i is in the center.
if (s.charAt(left) != s.charAt(right)) {
break;
}
left--;
right++;
}
return s.substring(left + 1, right);
}
}
其它比较牛的解法:http://blog.csdn.net/hopeztm/article/details/7932245
Ref: http://blog.csdn.net/fightforyourdream/article/details/21309759
http://blog.163.com/zhaohai_1988/blog/static/2095100852012716105847112/
http://blog.csdn.net/fightforyourdream/article/details/15025663
Leetcode:【DP】Longest Palindromic Substring 解题报告的更多相关文章
- 【LeetCode】Longest Palindromic Substring 解题报告
DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...
- 【LeetCode】647. Palindromic Substrings 解题报告(Python)
[LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...
- 【JAVA、C++】LeetCode 005 Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- Java [leetcode 5] Longest Palindromic Substring
问题描述: Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode 5 Longest Palindromic Substring(最长子序列)
题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...
随机推荐
- 要成为linux网站运维工程师必须要掌握的技能
要成为linux网站运维工程师必须要掌握的技能 2015-07-27 发表 老男孩点评:感谢此文的作者,写的非常到位,值得入门的初学者认真看看 我是一名linux运维工程师,确切的说是网站运维工程师, ...
- 树莓派进阶之路 (010) - 树莓派raspi-config配置(转)
经过前面两步我们的树莓派已经正常的工作起来了,但是在真正用它开发之前还需要进行一些列的配置以及软件的安装,这样开发起来才会得心应手,下面我们介绍一下常用的软件和服务 1.配置选项: 树莓派第一次使用的 ...
- mac系统下安装mysql 和phpmyadmin
用惯了在Windows上一个appserv或phpStudy压缩包搞定,要在MAC OSX 10.10上捣腾一个PHP开发环境还不大习惯.但自己亲自配一下环境还是有所收获的.众所周知OSX上自带了ap ...
- 黑客公布2012年最弱智密码Top25(转)
尽管弱密码对安全性的危害大家都知道,但是仍然有很多网民使用超弱密码.日前,黑客公布了一份密码文档,列出了今年最弱智密码. 根据 SplashData 公布的“年度最弱智密码 Top25”,和去年一样, ...
- Oracle 12C -- 设置CDB启动后,PDBs自动启动
CDB重启后,PDBs默认是处于mounted状态 SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ---------------- ...
- python开发者框架套件总结: package 包 frameworks
python开发者的package 包 框架套件总结: frameworks 开发环境: anaconda pycharm django awesome-django : 介绍 django ...
- 基于C/S模式的android手机与PC机通信系统的开发
原文链接: http://blog.csdn.net/nupt123456789/article/details/8213486 基于C/S模式的android手机与PC机通信系统的开发 作者:郑海波 ...
- Linux 查看文件 cat与 more 用法
1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如: [root@localhost ~]# c ...
- unity, unity默认的Arial字体在编译出的h5版本中不显示
unity默认的Arial字体在编译出的h5版本中不显示.改用自己的字体可显示.
- haproxy 同一域名下分发请求
http://www.th7.cn/Program/java/201608/936162.shtml https://my.oschina.net/lockupme/blog/733375 还有一点要 ...