@@ -68,25 +68,202 @@ tags:
68
68
#### Python3
69
69
70
70
``` python
71
-
71
+ class Solution :
72
+ def maxProduct (self , s : str ) -> int :
73
+ n = len (s)
74
+ hlen = [0 ] * n
75
+ center = right = 0
76
+
77
+ for i in range (n):
78
+ if i < right:
79
+ hlen[i] = min (right - i, hlen[2 * center - i])
80
+ while (
81
+ 0 <= i - 1 - hlen[i]
82
+ and i + 1 + hlen[i] < len (s)
83
+ and s[i - 1 - hlen[i]] == s[i + 1 + hlen[i]]
84
+ ):
85
+ hlen[i] += 1
86
+ if right < i + hlen[i]:
87
+ center, right = i, i + hlen[i]
88
+
89
+ prefix = [0 ] * n
90
+ suffix = [0 ] * n
91
+
92
+ for i in range (n):
93
+ prefix[i + hlen[i]] = max (prefix[i + hlen[i]], 2 * hlen[i] + 1 )
94
+ suffix[i - hlen[i]] = max (suffix[i - hlen[i]], 2 * hlen[i] + 1 )
95
+
96
+ for i in range (1 , n):
97
+ prefix[~ i] = max (prefix[~ i], prefix[~ i + 1 ] - 2 )
98
+ suffix[i] = max (suffix[i], suffix[i - 1 ] - 2 )
99
+
100
+ for i in range (1 , n):
101
+ prefix[i] = max (prefix[i - 1 ], prefix[i])
102
+ suffix[~ i] = max (suffix[~ i], suffix[~ i + 1 ])
103
+
104
+ return max (prefix[i - 1 ] * suffix[i] for i in range (1 , n))
72
105
```
73
106
74
107
#### Java
75
108
76
109
``` java
77
-
110
+ class Solution {
111
+ public long maxProduct (String s ) {
112
+ int n = s. length();
113
+ if (n == 2 ) return 1 ;
114
+ int [] len = manachers(s);
115
+ long [] left = new long [n];
116
+ int max = 1 ;
117
+ left[0 ] = max;
118
+ for (int i = 1 ; i <= n - 1 ; i++ ) {
119
+ if (len[(i - max - 1 + i) / 2 ] > max) max += 2 ;
120
+ left[i] = max;
121
+ }
122
+ max = 1 ;
123
+ long [] right = new long [n];
124
+ right[n - 1 ] = max;
125
+ for (int i = n - 2 ; i >= 0 ; i-- ) {
126
+ if (len[(i + max + 1 + i) / 2 ] > max) max += 2 ;
127
+ right[i] = max;
128
+ }
129
+ long res = 1 ;
130
+ for (int i = 1 ; i < n; i++ ) {
131
+ res = Math . max(res, left[i - 1 ] * right[i]);
132
+ }
133
+ return res;
134
+ }
135
+ private int [] manachers (String s ) {
136
+ int len = s. length();
137
+ int [] P = new int [len];
138
+ int c = 0 ;
139
+ int r = 0 ;
140
+ for (int i = 0 ; i < len; i++ ) {
141
+ int mirror = (2 * c) - i;
142
+ if (i < r) {
143
+ P [i] = Math . min(r - i, P [mirror]);
144
+ }
145
+ int a = i + (1 + P [i]);
146
+ int b = i - (1 + P [i]);
147
+ while (a < len && b >= 0 && s. charAt(a) == s. charAt(b)) {
148
+ P [i]++ ;
149
+ a++ ;
150
+ b-- ;
151
+ }
152
+ if (i + P [i] > r) {
153
+ c = i;
154
+ r = i + P [i];
155
+ }
156
+ }
157
+ for (int i = 0 ; i < len; i++ ) {
158
+ P [i] = 1 + 2 * P [i];
159
+ }
160
+ return P ;
161
+ }
162
+ }
78
163
```
79
164
80
165
#### C++
81
166
82
167
``` cpp
83
-
168
+ class Solution {
169
+ public:
170
+ long long maxProduct(string s) {
171
+ long long res = 0, l = 0, n = s.size();
172
+ vector<int > m(n), r(n);
173
+
174
+ for (int i = 0, l = 0, r = -1; i < n; ++i) {
175
+ int k = (i > r) ? 1 : min(m[l + r - i], r - i + 1);
176
+ while (0 <= i - k && i + k < n && s[i - k] == s[i + k])
177
+ k++;
178
+ m[i] = k--;
179
+ if (i + k > r) {
180
+ l = i - k;
181
+ r = i + k;
182
+ }
183
+ }
184
+
185
+ queue<array<int , 2 >> q, q1;
186
+
187
+ for (int i = n - 1 ; i >= 0 ; --i) {
188
+ while (!q.empty() && q.front()[0] - q.front()[1] > i - 1)
189
+ q.pop();
190
+ r[i] = 1 + (q.empty() ? 0 : (q.front()[0] - i) * 2);
191
+ q.push({i, m[i]});
192
+ }
193
+
194
+ for (int i = 0; i < n - 1; i++) {
195
+ while (!q1.empty() && q1.front()[0] + q1.front()[1] < i + 1)
196
+ q1.pop();
197
+ l = max(l, 1ll + (q1.empty() ? 0 : (i - q1.front()[0]) * 2));
198
+ res = max(res, l * r[i + 1]);
199
+ q1.push({i, m[i]});
200
+ }
201
+
202
+ return res;
203
+ }
204
+ };
84
205
```
85
206
86
207
#### Go
87
208
88
209
``` go
89
-
210
+ func maxProduct (s string ) int64 {
211
+ n := len (s)
212
+ hlen := make ([]int , n)
213
+ center , right := 0 , 0
214
+
215
+ for i := 0 ; i < n; i++ {
216
+ if i < right {
217
+ mirror := 2 *center - i
218
+ if mirror >= 0 && mirror < n {
219
+ hlen[i] = min (right-i, hlen[mirror])
220
+ }
221
+ }
222
+ for i-1 -hlen[i] >= 0 && i+1 +hlen[i] < n && s[i-1 -hlen[i]] == s[i+1 +hlen[i]] {
223
+ hlen[i]++
224
+ }
225
+ if i+hlen[i] > right {
226
+ center = i
227
+ right = i + hlen[i]
228
+ }
229
+ }
230
+
231
+ prefix := make ([]int , n)
232
+ suffix := make ([]int , n)
233
+
234
+ for i := 0 ; i < n; i++ {
235
+ r := i + hlen[i]
236
+ if r < n {
237
+ prefix[r] = max (prefix[r], 2 *hlen[i]+1 )
238
+ }
239
+ l := i - hlen[i]
240
+ if l >= 0 {
241
+ suffix[l] = max (suffix[l], 2 *hlen[i]+1 )
242
+ }
243
+ }
244
+
245
+ for i := 1 ; i < n; i++ {
246
+ if n-i-1 >= 0 {
247
+ prefix[n-i-1 ] = max (prefix[n-i-1 ], prefix[n-i]-2 )
248
+ }
249
+ suffix[i] = max (suffix[i], suffix[i-1 ]-2 )
250
+ }
251
+
252
+ for i := 1 ; i < n; i++ {
253
+ prefix[i] = max (prefix[i-1 ], prefix[i])
254
+ suffix[n-i-1 ] = max (suffix[n-i], suffix[n-i-1 ])
255
+ }
256
+
257
+ var res int64
258
+ for i := 1 ; i < n; i++ {
259
+ prod := int64 (prefix[i-1 ]) * int64 (suffix[i])
260
+ if prod > res {
261
+ res = prod
262
+ }
263
+ }
264
+
265
+ return res
266
+ }
90
267
```
91
268
92
269
<!-- tabs:end -->
0 commit comments