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