《leetCode》:Longest Palindromic Substring

来源:互联网 发布:原生js dialog 编辑:程序博客网 时间:2024/06/05 02:05

题目

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.

思路一:暴力搜索法

暴力搜索法:利用两层for循环来判断所有的字符串,找出长度最大的那个是回文的字符子串。

实现代码如下:

   public String longestPalindrome(String s) {        if(s==null||s.length()<2){            return s;        }        int len =s.length();        String res = new String();        for(int i=0;i<len;i++){            char ch = s.charAt(i);            for(int j=i+1;j<len;j++){                char ch2 = s.charAt(j);                if(ch==ch2){                    String str = s.substring(i, j+1);//                    if(isPalindrome(str)){                        if(str.length()>res.length()){                            res = str;                        }                    }                }            }        }        return res;    }    //判断一个字符串是否是palindrome    private boolean isPalindrome(String str) {        if(str==null||str.length()<1){            return false;        }        int begin = 0;        int end = str.length()-1;        while(begin<end){            if(str.charAt(begin)!=str.charAt(end)){                return false;            }            begin++;            end--;        }        return true;    }

显然,报超时。

对上面的代码进行改进,内层循环从后面开始遍历,只要找到一个回文,就可以跳出内层循环(后面的即使还存在回文,则肯定比这个长度要短)。

代码如下:

   public String longestPalindrome(String s) {        if(s==null||s.length()<2){            return s;        }        int len =s.length();        String res = new String();        for(int i=0;i<len;i++){            char ch = s.charAt(i);            //根据此时的res来限制j的范围            for(int j=len-1;j>=i+res.length();j--){                char ch2 = s.charAt(j);                if(ch==ch2){                    String str = s.substring(i, j+1);//                    if(isPalindrome(str)){                            //如果此时str为回文,则长度一定大于此时的res,因此不需要判断就可以进行更新                            res = str;                            break;                    }                }            }        }        return res;    }    //判断一个字符串是否是palindrome    private boolean isPalindrome(String str) {        if(str==null||str.length()<1){            return false;        }        int begin = 0;        int end = str.length()-1;        while(begin<end){            if(str.charAt(begin)!=str.charAt(end)){                return false;            }            begin++;            end--;        }        return true;    }

很可惜,并没有如我们所愿AC,还是报超时。

思路二:

思路来至于:https://discuss.leetcode.com/topic/23498/very-simple-clean-java-solution

代码如下:

public class LongestPalindrome3 {    int lowIndex = -1;    int maxLen = -1;    public String longestPalindrome(String s) {        if(s==null||s.length()<2){            return s;        }        int len =s.length();        for(int i=0;i<len-1;i++){            //找出以i为中心的最大回文字符串            extendsPalindrome(s,i,i);//assume odd number            extendsPalindrome(s,i,i+1);//assume even number        }        return s.substring(lowIndex, lowIndex+maxLen);    }    private void extendsPalindrome(String s, int i, int j) {        if(s==null||i>j){            return ;        }        while(i>=0&&i<=j&&j<s.length()&&s.charAt(i)==s.charAt(j)){            i--;            j++;        }        int len = (j-1)-(i+1)+1;        if(maxLen<len){            lowIndex = i+1;            maxLen = len;        }    }    public static void main(String[] args){        String str = "111";        String res = new LongestPalindrome3().longestPalindrome(str);        System.out.println(res);    }}
1 0