Leetcode 5 Longest Palindromic Substring

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值