Skip to content

Commit 5234f26

Browse files
committed
feat: add solutions to lc problem: No.2002
No.2002.Maximum Product of the Length of Two Palindromic Subsequences
1 parent a9951a0 commit 5234f26

File tree

6 files changed

+443
-2
lines changed

6 files changed

+443
-2
lines changed

solution/2000-2099/2002.Maximum Product of the Length of Two Palindromic Subsequences/README.md

Lines changed: 156 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,177 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
**方法一:二进制枚举**
57+
58+
我们注意到,字符串 $s$ 的长度不超过 $12$,因此我们可以使用二进制枚举的方法来枚举 $s$ 的所有子序列。不妨设 $s$ 的长度为 $n$,我们可以使用 $2^n$ 个长度为 $n$ 的二进制数来表示 $s$ 的所有子序列。对于每个二进制数,第 $i$ 位为 $1$ 表示 $s$ 的第 $i$ 个字符在子序列中,为 $0$ 表示不在子序列中。我们对于每个二进制数,判断其是否为回文子序列,并且记录在数组 $p$ 中。
59+
60+
接下来,我们枚举 $p$ 中的每个数 $i$,如果 $i$ 是回文子序列,那么我们可以从 $i$ 的补集 $mx = (2^n - 1) \& \overline{i}$ 中枚举一个数 $j$,如果 $j$ 也是回文子序列,那么 $i$ 和 $j$ 就是我们要找的两个回文子序列,它们的长度分别为 $i$ 和 $j$ 的二进制表示中的 $1$ 的个数,我们记为 $a$ 和 $b$,那么它们的乘积就是 $a \times b$,我们取所有可能的 $a \times b$ 中的最大值即可。
61+
62+
时间复杂度 $(2^n \times n + 3^n)$,空间复杂度 $O(2^n)$。其中 $n$ 为字符串 $s$ 的长度。
63+
5664
<!-- tabs:start -->
5765

5866
### **Python3**
5967

6068
<!-- 这里可写当前语言的特殊实现逻辑 -->
6169

6270
```python
63-
71+
class Solution:
72+
def maxProduct(self, s: str) -> int:
73+
n = len(s)
74+
p = [True] * (1 << n)
75+
for k in range(1, 1 << n):
76+
i, j = 0, n - 1
77+
while i < j:
78+
while i < j and (k >> i & 1) == 0:
79+
i += 1
80+
while i < j and (k >> j & 1) == 0:
81+
j -= 1
82+
if i < j and s[i] != s[j]:
83+
p[k] = False
84+
break
85+
i, j = i + 1, j - 1
86+
ans = 0
87+
for i in range(1, 1 << n):
88+
if p[i]:
89+
mx = ((1 << n) - 1) ^ i
90+
j = mx
91+
a = i.bit_count()
92+
while j:
93+
if p[j]:
94+
b = j.bit_count()
95+
ans = max(ans, a * b)
96+
j = (j - 1) & mx
97+
return ans
6498
```
6599

66100
### **Java**
67101

68102
<!-- 这里可写当前语言的特殊实现逻辑 -->
69103

70104
```java
105+
class Solution {
106+
public int maxProduct(String s) {
107+
int n = s.length();
108+
boolean[] p = new boolean[1 << n];
109+
Arrays.fill(p, true);
110+
for (int k = 1; k < 1 << n; ++k) {
111+
for (int i = 0, j = n - 1; i < n; ++i, --j) {
112+
while (i < j && (k >> i & 1) == 0) {
113+
++i;
114+
}
115+
while (i < j && (k >> j & 1) == 0) {
116+
--j;
117+
}
118+
if (i < j && s.charAt(i) != s.charAt(j)) {
119+
p[k] = false;
120+
break;
121+
}
122+
}
123+
}
124+
int ans = 0;
125+
for (int i = 1; i < 1 << n; ++i) {
126+
if (p[i]) {
127+
int a = Integer.bitCount(i);
128+
int mx = ((1 << n) - 1) ^ i;
129+
for (int j = mx; j > 0; j = (j - 1) & mx) {
130+
if (p[j]) {
131+
int b = Integer.bitCount(j);
132+
ans = Math.max(ans, a * b);
133+
}
134+
}
135+
}
136+
}
137+
return ans;
138+
}
139+
}
140+
```
141+
142+
### **C++**
143+
144+
```cpp
145+
class Solution {
146+
public:
147+
int maxProduct(string s) {
148+
int n = s.size();
149+
vector<bool> p(1 << n, true);
150+
for (int k = 1; k < 1 << n; ++k) {
151+
for (int i = 0, j = n - 1; i < j; ++i, --j) {
152+
while (i < j && !(k >> i & 1)) {
153+
++i;
154+
}
155+
while (i < j && !(k >> j & 1)) {
156+
--j;
157+
}
158+
if (i < j && s[i] != s[j]) {
159+
p[k] = false;
160+
break;
161+
}
162+
}
163+
}
164+
int ans = 0;
165+
for (int i = 1; i < 1 << n; ++i) {
166+
if (p[i]) {
167+
int a = __builtin_popcount(i);
168+
int mx = ((1 << n) - 1) ^ i;
169+
for (int j = mx; j; j = (j - 1) & mx) {
170+
if (p[j]) {
171+
int b = __builtin_popcount(j);
172+
ans = max(ans, a * b);
173+
}
174+
}
175+
}
176+
}
177+
return ans;
178+
}
179+
};
180+
```
71181
182+
### **Go**
183+
184+
```go
185+
func maxProduct(s string) (ans int) {
186+
n := len(s)
187+
p := make([]bool, 1<<n)
188+
for i := range p {
189+
p[i] = true
190+
}
191+
for k := 1; k < 1<<n; k++ {
192+
for i, j := 0, n-1; i < j; i, j = i+1, j-1 {
193+
for i < j && (k>>i&1) == 0 {
194+
i++
195+
}
196+
for i < j && (k>>j&1) == 0 {
197+
j--
198+
}
199+
if i < j && s[i] != s[j] {
200+
p[k] = false
201+
break
202+
}
203+
}
204+
}
205+
for i := 1; i < 1<<n; i++ {
206+
if p[i] {
207+
a := bits.OnesCount(uint(i))
208+
mx := (1<<n - 1) ^ i
209+
for j := mx; j > 0; j = (j - 1) & mx {
210+
if p[j] {
211+
b := bits.OnesCount(uint(j))
212+
ans = max(ans, a*b)
213+
}
214+
}
215+
}
216+
}
217+
return
218+
219+
}
220+
221+
func max(a, b int) int {
222+
if a > b {
223+
return a
224+
}
225+
return b
226+
}
72227
```
73228

74229
### **...**

solution/2000-2099/2002.Maximum Product of the Length of Two Palindromic Subsequences/README_EN.md

Lines changed: 148 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,160 @@ The product of their lengths is: 5 * 5 = 25.
5353
### **Python3**
5454

5555
```python
56-
56+
class Solution:
57+
def maxProduct(self, s: str) -> int:
58+
n = len(s)
59+
p = [True] * (1 << n)
60+
for k in range(1, 1 << n):
61+
i, j = 0, n - 1
62+
while i < j:
63+
while i < j and (k >> i & 1) == 0:
64+
i += 1
65+
while i < j and (k >> j & 1) == 0:
66+
j -= 1
67+
if i < j and s[i] != s[j]:
68+
p[k] = False
69+
break
70+
i, j = i + 1, j - 1
71+
ans = 0
72+
for i in range(1, 1 << n):
73+
if p[i]:
74+
mx = ((1 << n) - 1) ^ i
75+
j = mx
76+
a = i.bit_count()
77+
while j:
78+
if p[j]:
79+
b = j.bit_count()
80+
ans = max(ans, a * b)
81+
j = (j - 1) & mx
82+
return ans
5783
```
5884

5985
### **Java**
6086

6187
```java
88+
class Solution {
89+
public int maxProduct(String s) {
90+
int n = s.length();
91+
boolean[] p = new boolean[1 << n];
92+
Arrays.fill(p, true);
93+
for (int k = 1; k < 1 << n; ++k) {
94+
for (int i = 0, j = n - 1; i < n; ++i, --j) {
95+
while (i < j && (k >> i & 1) == 0) {
96+
++i;
97+
}
98+
while (i < j && (k >> j & 1) == 0) {
99+
--j;
100+
}
101+
if (i < j && s.charAt(i) != s.charAt(j)) {
102+
p[k] = false;
103+
break;
104+
}
105+
}
106+
}
107+
int ans = 0;
108+
for (int i = 1; i < 1 << n; ++i) {
109+
if (p[i]) {
110+
int a = Integer.bitCount(i);
111+
int mx = ((1 << n) - 1) ^ i;
112+
for (int j = mx; j > 0; j = (j - 1) & mx) {
113+
if (p[j]) {
114+
int b = Integer.bitCount(j);
115+
ans = Math.max(ans, a * b);
116+
}
117+
}
118+
}
119+
}
120+
return ans;
121+
}
122+
}
123+
```
124+
125+
### **C++**
126+
127+
```cpp
128+
class Solution {
129+
public:
130+
int maxProduct(string s) {
131+
int n = s.size();
132+
vector<bool> p(1 << n, true);
133+
for (int k = 1; k < 1 << n; ++k) {
134+
for (int i = 0, j = n - 1; i < j; ++i, --j) {
135+
while (i < j && !(k >> i & 1)) {
136+
++i;
137+
}
138+
while (i < j && !(k >> j & 1)) {
139+
--j;
140+
}
141+
if (i < j && s[i] != s[j]) {
142+
p[k] = false;
143+
break;
144+
}
145+
}
146+
}
147+
int ans = 0;
148+
for (int i = 1; i < 1 << n; ++i) {
149+
if (p[i]) {
150+
int a = __builtin_popcount(i);
151+
int mx = ((1 << n) - 1) ^ i;
152+
for (int j = mx; j; j = (j - 1) & mx) {
153+
if (p[j]) {
154+
int b = __builtin_popcount(j);
155+
ans = max(ans, a * b);
156+
}
157+
}
158+
}
159+
}
160+
return ans;
161+
}
162+
};
163+
```
62164
165+
### **Go**
166+
167+
```go
168+
func maxProduct(s string) (ans int) {
169+
n := len(s)
170+
p := make([]bool, 1<<n)
171+
for i := range p {
172+
p[i] = true
173+
}
174+
for k := 1; k < 1<<n; k++ {
175+
for i, j := 0, n-1; i < j; i, j = i+1, j-1 {
176+
for i < j && (k>>i&1) == 0 {
177+
i++
178+
}
179+
for i < j && (k>>j&1) == 0 {
180+
j--
181+
}
182+
if i < j && s[i] != s[j] {
183+
p[k] = false
184+
break
185+
}
186+
}
187+
}
188+
for i := 1; i < 1<<n; i++ {
189+
if p[i] {
190+
a := bits.OnesCount(uint(i))
191+
mx := (1<<n - 1) ^ i
192+
for j := mx; j > 0; j = (j - 1) & mx {
193+
if p[j] {
194+
b := bits.OnesCount(uint(j))
195+
ans = max(ans, a*b)
196+
}
197+
}
198+
}
199+
}
200+
return
201+
202+
}
203+
204+
func max(a, b int) int {
205+
if a > b {
206+
return a
207+
}
208+
return b
209+
}
63210
```
64211

65212
### **...**
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
public:
3+
int maxProduct(string s) {
4+
int n = s.size();
5+
vector<bool> p(1 << n, true);
6+
for (int k = 1; k < 1 << n; ++k) {
7+
for (int i = 0, j = n - 1; i < j; ++i, --j) {
8+
while (i < j && !(k >> i & 1)) {
9+
++i;
10+
}
11+
while (i < j && !(k >> j & 1)) {
12+
--j;
13+
}
14+
if (i < j && s[i] != s[j]) {
15+
p[k] = false;
16+
break;
17+
}
18+
}
19+
}
20+
int ans = 0;
21+
for (int i = 1; i < 1 << n; ++i) {
22+
if (p[i]) {
23+
int a = __builtin_popcount(i);
24+
int mx = ((1 << n) - 1) ^ i;
25+
for (int j = mx; j; j = (j - 1) & mx) {
26+
if (p[j]) {
27+
int b = __builtin_popcount(j);
28+
ans = max(ans, a * b);
29+
}
30+
}
31+
}
32+
}
33+
return ans;
34+
}
35+
};

0 commit comments

Comments
 (0)