(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);
}
}