Leetcode 5 Longest Palindromic Substring
2015-07-24 22:20
316 查看
Longest Palindromic Substring
Given 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.Solution1
最简单的方法是用暴力去遍历。思路是每次迭代的时候都固定一个i,然后从后面去遍历整个字符串,判断两个指针中间是否为回文串,从后面遍历的好处是:如果找到某一段是回文串,则可以提前退出这次查找,因为剩下的即便有回文串也一定比当前已经找到的要短。但即便如此,这种思路实现在leetcode上对于特定的字符串会报超时错误。代码如下:public class Solution { public String longestPalindrome(String s) { if(s.length()==0) return ""; int start=0,end=0; for(int i=0;i<s.length();i++){//每次迭代,都先固定i后去遍历j直到找到一个回文串 for(int j=s.length()-1;j>=i;j--){ int k=i,l=j; for(;k<l;k++,l--) if(s.charAt(k)!=s.charAt(l)) break;//此次循环不是回文串 if(k>=l){//表明是回文串 if(j-i>end-start){ start = i; end = j; } break;//这是此次固定i后能找到的最长的回文串,所以j不用再继续减了 } } } return s.substring(start,end+1); } }
Solution2
解法1超时主要在于当字符串的一段全是重复字符的时候,都必须这段重复字符进行遍历尝试,从而浪费了大量时间,比如”baaaaaaaaab”,实际可以转换另一种思路,因为每一段回文串都必定是以其中一个字符为中心点对称的,所以可以根据这个特点来从某一个中心点去往两边扩展,观察该中心点两边是否对称,并且在选择中心点的时候直接跳过那些重复字符。代码如下:public class Solution { public String longestPalindrome(String s) { if(s.length()==0) return ""; int start=0,end=1; for(int i=0;i<s.length();){ int j=i+1; for(;j<s.length()&&s.charAt(j)==s.charAt(i);j++);//跳过重复的字符 int m=i-1,n=j;//从重复字符的两端开始判断是否对称 for(;m>=0&&n<s.length()&&s.charAt(m)==s.charAt(n);m--,n++); if(n-m-1>end-start){ start = m+1; end = n; } i=j;//下一次判断直接跳过重复的字符 } return s.substring(start,end);//当为空字符串的时候,无法调用substring()方法 } }
可以看到这种思路的主要特定是以每一个字符为中心点,然后以此往两边扩张到最长。
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解
- LeetCode [Day 5] Longest Palindromic Substring 题解
- LeetCode [Day 6] ZigZag Conversion 题解