(5)-(Longest Palindromic Substring )-(最长回文字串)-(特殊解法,)

(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,
//and there exists one unique longest palindromic substring.

public class Solution
{
    //先对奇偶数进行统一处理
    //($)"#+char"(#) 2n+2,必为偶数
    private String preProcess(String s)
    {
        int len = s.length();
        if (len == 0)
        { 
            return "$#";
        }
        StringBuffer sb = new StringBuffer("$");
        for (int i = 0; i < len; i++)
        {
            sb.append("#").append(s.charAt(i));
        }
        sb.append("##");
        return sb.toString();
    }
    
    public String longestPalindrome(String s) 
    {
        //得到统一后的偶数长度
        char[] str = preProcess(s).toCharArray();
        int len= str.length;
        
        int[] p = new int[len + 1];
        
        int id = 0, mx = 0;
        //两头两尾不考虑
        for (int i = 1; i < len-1 ; i++)
        {
            p[i]=0;
            if(mx>i)
            { 
                p[i]=Math.min(p[2*id-i],mx-i);
            }
            while (str[i + 1 + p[i]] == str[i - (1 + p[i])]) 
            { 
                p[i]++;
            }
            if (i + p[i] > mx)
            {
                mx = i + p[i];
                id = i;
            }
        }
        int max_len = 0, center = 0;
        for (int i = 1; i < len - 1; i++)
        {
            if (p[i] > max_len) 
            {
                max_len = p[i];
                center= i;
            }
        }
        int pos = (center - 1 - max_len) / 2;
        return s.substring(pos, pos + max_len);
    }
}

 

posted @ 2015-07-25 19:25  爱吃萝卜干  阅读(84)  评论(0编辑  收藏  举报