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