Skip to content

Commit 7cff981

Browse files
feat: add solutions to lc problem: No.1960 (#4585)
1 parent f4c6fcf commit 7cff981

File tree

6 files changed

+543
-8
lines changed

6 files changed

+543
-8
lines changed

solution/1900-1999/1960.Maximum Product of the Length of Two Palindromic Substrings/README.md

Lines changed: 181 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)