@@ -68,25 +68,202 @@ tags:
6868#### Python3
6969
7070``` 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))
72105```
73106
74107#### Java
75108
76109``` 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+ }
78163```
79164
80165#### C++
81166
82167``` 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+ };
84205```
85206
86207#### Go
87208
88209``` 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+ }
90267```
91268
92269<!-- tabs:end -->
0 commit comments