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.

思路一:逐个字符判断,两种判断形式,一种是当前字符和下一个字符为开始,一个是当前字符的前一个和后一个字符为开始,时间复杂度为O(n^2)。

public String longestPalindrome(String s) {
        if(s == null || s.length() == 0) return "";
        String ret = "";
        int len = s.length();
        for(int i=0; i<len; i++) {
            String tmp1 = helper(s, i, i+1);
            String tmp2 = helper(s, i-1, i+1);
            String tmp = tmp1.length() > tmp2.length() ? tmp1 : tmp2;
            ret = ret.length() > tmp.length() ? ret : tmp;
        }
        return ret;
    }
    
    public String helper(String s, int left, int right) {
        int len = s.length();
        while(left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
            left--;
            right++;
        }
        return s.substring(left+1, right);
    }

 

思路二:Manacher算法,时间复杂度为O(n)。

具体算法思想可以参考:

http://blog.csdn.net/insistgogo/article/details/12287805

http://blog.csdn.net/pi9nc/article/details/9251455

public String longestPalindromeII(String s) {
        if(s == null || s.length() == 0) return "";
        StringBuilder sb = new StringBuilder();
        sb.append('s').append('#');
        for(int i=0; i<s.length(); i++) sb.append(s.charAt(i)).append('#');
        String newStr = sb.toString();
        int[] p = new int[sb.length()];
        manacher(newStr, p);
        int idx = 0;
        for(int i=1; i<p.length; i++) idx = p[i] > p[idx] ? i : idx;
        return newStr.substring(idx - p[idx], idx + p[idx] + 1).replace("#", "");
    }
    
    public void manacher(String s, int[] p) {
        int id = 1;
        int mx = 1;
        for(int i=1; i<s.length(); i++) {
            if(mx > i) p[i] = Math.min(mx - i, p[(id<<1) - i]);
            else p[i] = 0;
            while(i+p[i]+1 < s.length() && i-p[i]-1 > 0 
                    && s.charAt(i+p[i]+1) == s.charAt(i-p[i]-1)) p[i]++;
            if(i + p[i] > mx) {
                id = i;
                mx = i + p[i];
            }
        }
    }

 

posted on 2015-08-15 20:26  绿树荫  阅读(121)  评论(0编辑  收藏  举报

导航