leetcode-5. Longest Palindromic Substring

来源:互联网 发布:淘宝图片轮播什么意识 编辑:程序博客网 时间:2024/06/02 02:53

leetcode-5. 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.

这题总的来看的话有3类比较好的写法吧。不过这里我只实现了两种。

DP算法

第一类是DP。这类没有实现。就是构造一个int[s.length][s.length]的数组。当然时间复杂度和空间复杂度都是O(n^2);

O(N^2)中心算法

第二类是先找到回文的中心,然后分奇偶两种情况去找,这样时间复杂度是O(n^2),空间复杂度应该是O(n);、
leetcode讨论里的答案一般都是这种。这种解题思路比较清晰。

public class Solution {    private String longest = "";    public String longestPalindrome(String s) {        for(int i = 0 ; i < s.length() ; i++){            helper1(s,i);            helper2(s,i);        }        return longest;    }    private void helper1(String s, int t){        for(int i = t, j = t;i>=0 && j <s.length();i--,j++){            if(s.charAt(i)==s.charAt(j))                longest = j-i+1 > longest.length() ? s.substring(i,j+1):longest;            else                break;        }    }    private void helper2(String s, int t){        for(int i = t, j = t+1;i>=0 && j <s.length();i--,j++){            if(s.charAt(i)==s.charAt(j))                longest = j-i+1 > longest.length() ? s.substring(i,j+1):longest;            else                break;        }    }}

Manacher算法

时间复杂度是O(n),是非常漂亮算法。就是理解稍微复杂一些。
网上有比较多的解释。
但是实际上,我用这个实现的时候submit上的代码跑起来比第二种算法还要慢,以至于TLE。。后来看一下讨论里的Manacher算法。发现他是把String的操作改成char[]。这样应该会快一些。不过我这里就不做了。

public class Solution {    public String longestPalindrome(String s) {        String st = "#";        for(int i = 0 ; i < s.length() ; i++)            st += s.charAt(i)+"#";        st = "$"+st+"$";        // System.out.println(st);        int right = 0, cenpos = 0,ans = 0, ansi = 0;        int [] len = new int[st.length()];        for(int i = 1 ; i < len.length ; i++){            if(right > i){                len[i] = Math.min(right-i,len[2*cenpos-i]);            }else{                len[i] = 1;            }            while((i-len[i])>=0 && (i+len[i])<st.length() && st.charAt(i-len[i])==st.charAt(i+len[i]))                len[i]++;            len[i]--;            if(len[i]+i>right){                right = len[i]+i;                cenpos = i;            }            if(len[i]>ans){                ans = len[i];                ansi = i;            }        }        String ret = st.substring(ansi-ans,ansi+ans+1);        String r = "";        for(int i = 0 ; i <ret.length();i++)            if(ret.charAt(i)!='#' &&ret.charAt(i)!='$')                r+=ret.charAt(i);        // System.out.println(r);        return r;    }}

manacher的解释
AC的manacher算法的java实现
5. Longest Palindromic Substring算法小结

0 0
原创粉丝点击