Leetcode 5 Longest Palindromic Substring

来源:互联网 发布:眼镜零售店软件 编辑:程序博客网 时间:2024/06/18 05:33

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()方法    }}
  • 可以看到这种思路的主要特定是以每一个字符为中心点,然后以此往两边扩张到最长。
0 0
原创粉丝点击