Longest Palindromic Substring(medium 常考)
来源:互联网 发布:湖南大学网络教学平台 编辑:程序博客网 时间:2024/06/07 01:02
【题目】
Given a string S, find the longest palindromic substring inS. You may assume that the maximum length ofS is 1000, and there exists one unique longest palindromic substring.
【题意】
求出字符串中最长回文
【分析】
有两种方法。 第一种方法的思路是对于每个子串的中心(可以是一个字符,或者是两个字符的间隙,比如串abc,中心可以是a,b,c,或者是ab的间隙,bc的间隙)往两边同时进行扫描,直到不是回文串为止。假设字符串的长度为n,那么中心的个数为2*n-1(字符作为中心有n个,间隙有n-1个)。对于每个中心往两边扫描的复杂度为O(n),所以时间复杂度为O((2*n-1)*n)=O(n^2),空间复杂度为O(1),
【实现】
public class Solution { public String longestPalindrome(String s) { if(s == null || s.length()==0) return ""; int longest = 0; String res = ""; for(int i=0;i<2*s.length()-1;i++) { int left = i/2; int right = i/2; if(i%2==1) right++; String str = lengthOfPalindrome(s,left,right); if(longest<str.length()) { longest = str.length(); res = str; } } return res;}private String lengthOfPalindrome(String s, int left, int right){ while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)) { left--; right++; } return s.substring(left+1,right);}}
动态规划的想法:
诀窍就是避免重复计算(即重复检测同一子串)。考虑这个例子”ababa”。如果我们已经检测过”bab”是回文,那么只需判断一下最左右的两个字符(即两个a)是否相同即可判定”ababa”是否回文了。
外层循环i从后往前扫,内层循环j从i当前字符扫到结尾处。过程中使用的历史信息是从i+1到n之间的任意子串是否是回文已经被记录下来,所以不用重新判断,只需要比较一下头尾字符即可。这种方法使用两层循环,时间复杂度是O(n^2)。而空间上因为需要记录任意子串是否为回文,需要O(n^2)的空间,
public String longestPalindrome(String s) { if(s == null || s.length()==0) return ""; boolean[][] palin = new boolean[s.length()][s.length()]; String res = ""; int maxLen = 0; for(int i=s.length()-1;i>=0;i--) { for(int j=i;j<s.length();j++) { if(s.charAt(i)==s.charAt(j) && (j-i<=2 || palin[i+1][j-1])) { palin[i][j] = true; if(maxLen<j-i+1) { maxLen=j-i+1; res = s.substring(i,j+1); } } } } return res;}
综上所述,两种方法的时间复杂度都是O(n^2),只是第一种方法的常数会大一些。而空间上来看第一种方法是常量的,比第二种方法优。这个题目中假设最长回文子串只有一个,实际面试中一般不做这种假设,如果要返回所有最长回文串,只需要稍做变化就可以,维护一个集合,如果等于当前最大的,即加入集合,否则,如果更长,则清空集合,加入当前这个。实际面试会有各种变体,感觉平常还是要多想才行。
http://my.oschina.net/jdflyfly/blog/283470
0 0
- Longest Palindromic Substring(medium 常考)
- 5. Longest Palindromic Substring (Medium)
- 5. Longest Palindromic Substring Medium
- [Leetcode 5, Medium] Longest Palindromic Substring
- 【Leetcode】(5)Longest Palindromic Substring(Medium)
- Leetcode 5. Longest Palindromic Substring (Medium) (cpp)
- (Leetcode)5. Longest Palindromic Substring(medium)
- Medium 5题 Longest Palindromic Substring
- Medium 5题 Longest Palindromic Substring
- Longest Palindromic Substring(leetcode medium algorithm problem)
- (算法分析Week6)Longest Palindromic Substring[Medium]
- 算法设计与分析(5)-- Longest Palindromic Substring(难度:Medium)
- LeetCode刷题(C++)——Longest Palindromic Substring(Medium)
- [LeetCode] 005. Longest Palindromic Substring (Medium) (C++/Java/Python)
- <LeetCode><Medium> 5 Longest Palindromic Substring #爆发式搜索
- LeetCode-5-Longest Palindromic Substring(动态规划)-Medium
- LeetCode第五关:Longest Palindromic Substring --> Difficulty: Medium
- 题解——Leetcode 5. Longest Palindromic Substring 难度:Medium
- [读书笔记]高性能php应用开发(1)
- Linux那些事儿之我是Sysfs(2)linux设备底层模型
- arm-linux驱动:初步字符设备
- mac上安装mysql后忘记密码解决方法
- 修改hosts文件
- Longest Palindromic Substring(medium 常考)
- mysql:Illegal mix of collations错误
- 晶体(crystal)和晶振(oscillator)
- Gson问题汇总
- setting
- mjRefurbish block方法
- 在eclipse 上搭建ssh框架
- FFmpeg源代码结构图 - 解码
- Could not find a storyboard named 'Main' in bundle NSBundle