Manacher

 

 1 public class T05_02_Manacher {
 2 
 3     public String longestPalindrome(String s) {
 4         /***
 5          * Manacher 返回 字符串长度
 6          *
 7          */
 8         //1.将字符串处理成Manacher字符串
 9 
10         //2.新建数组,记录相应位置的长度值,,,并且记录最右侧边缘,和对应的i
11 
12         //3.遍历字符串。判断此点是否在右侧边缘以内,若在边缘引内,
13 
14         char[] charArray = manacher(s);
15         int[] pArray = new int[charArray.length];
16         int pR = -1;
17         int index = -1;
18         int max = 0;
19         for (int i = 0; i < charArray.length; i++) {
20             pArray[i] = i < pR ? Math.min(pArray[2 * index - i], pR - i) : 1;
21             while (i + pArray[i] < charArray.length && i - pArray[i] >= 0) {
22                 if (charArray[i + pArray[i]] == charArray[i - pArray[i]]) {
23                     pArray[i]++;
24                 } else {
25                     break;
26                 }
27             }
28 
29             if (pArray[i] + i > pR) {
30                 pR = pArray[i] + i;
31                 index = i;
32             }
33             max = Math.max(max, pArray[i]);
34         }
35         int maxIndex = 0;
36         for (int i = 0; i < pArray.length; i++) {
37             if (pArray[i] == max) {
38                 maxIndex = i;
39                 break;
40             }
41         }
42         return s.substring((maxIndex - max + 2) / 2, (maxIndex - max + 2) / 2 + max - 1);
43 
44     }
45 
46     private char[] manacher(String s) {
47         String str = "#";
48         for (int i = 0; i < s.length(); i++) {
49             str += s.charAt(i) + "#";
50         }
51         return str.toCharArray();
52 
53     }
54 }

 

 

一回生,二回熟
原文地址:https://www.cnblogs.com/zzytxl/p/12431836.html