12
12
2. Time O(n^2), Space O(n)
13
13
3. Time O(n^2), Space O(1) (actually much more efficient than 1 & 2)
14
14
4. Time O(n), Space O(n) (Manacher's Algorithm)
15
+ 5. Time O(n), Smaller Space than solution 4. (Manacher's Algorithm)
15
16
*/
17
+
16
18
public class Solution {
17
19
public String longestPalindrome_1 (String s ) {
18
20
int n =s .length ();
@@ -73,12 +75,12 @@ public String longestPalindrome_4(String s) {
73
75
sb .append (s .charAt (i ));
74
76
}
75
77
sb .append ("#$" );
76
- n =2 *n +2 ;
78
+ n =2 *n +3 ;
77
79
int mx =0 ,id =0 ;
78
80
int []p =new int [n ];
79
81
Arrays .fill (p ,0 );
80
82
for (int i =1 ;i <n -1 ; ++i ) {
81
- p [i ] = (mx >i ) ?Math .min (p [2 *id -i ],mx -i ):0 ;
83
+ p [i ] = (mx >i ) ?Math .min (p [2 *id -i ],mx -i ) :0 ;
82
84
while (sb .charAt (i +1 +p [i ]) ==sb .charAt (i -1 -p [i ])) ++p [i ];
83
85
if (i +p [i ] >mx ) {
84
86
id =i ;mx =i +p [i ];
@@ -90,4 +92,30 @@ public String longestPalindrome_4(String s) {
90
92
idx = (idx -maxLen -1 ) /2 ;
91
93
return s .substring (idx ,idx +maxLen );
92
94
}
95
+ public String longestPalindrome_5 (String s ) {
96
+ int n =s .length ();
97
+ int idx =0 ,maxLen =0 ;
98
+ int mx =0 ,id =0 ;
99
+ int []p =new int [2 *n +1 ];
100
+ Arrays .fill (p ,0 );
101
+ for (int i =0 ;i <2 *n +1 ; ++i ) {
102
+ p [i ] = (mx >i ) ?Math .min (p [2 *id -i ],mx -i ) :0 ;
103
+ int left =i -1 -p [i ],right =i +1 +p [i ];
104
+ while (left >=0 &&right <=2 *n ) {
105
+ if (left %2 ==0 ||s .charAt (left /2 ) ==s .charAt (right /2 )) {
106
+ ++p [i ];
107
+ }else break ;
108
+ --left ;
109
+ ++right ;
110
+ }
111
+ if (i +p [i ] >mx ) {
112
+ id =i ;mx =i +p [i ];
113
+ }
114
+ if (p [i ] >maxLen ) {
115
+ idx =i ;maxLen =p [i ];
116
+ }
117
+ }
118
+ idx = (idx -maxLen ) /2 ;
119
+ return s .substring (idx ,idx +maxLen );
120
+ }
93
121
}