Skip to content

Commit f1d743e

Browse files
committed
feat: add solutions to lc problem: No.1542
No.1542.Find Longest Awesome Substring
1 parent a2d5c34 commit f1d743e

File tree

6 files changed

+299
-2
lines changed

6 files changed

+299
-2
lines changed

solution/1500-1599/1542.Find Longest Awesome Substring/README.md

+112-1
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,133 @@
5656

5757
<!-- 这里可写通用的实现逻辑 -->
5858

59+
**方法一:状态压缩 + 前缀和思想**
60+
61+
根据题目描述,“超赞子字符串”中的字符可以通过交换得到回文字符串,因此,“超赞子字符串”中最多有一个数字字符出现奇数次,其余数字字符出现偶数次。
62+
63+
我们可以用一个整数 $st$ 来表示当前前缀字符串中数字字符出现的奇偶性,其中 $st$ 的第 $i$ 位表示数字字符 $i$ 出现的奇偶性,即 $st$ 的第 $i$ 位为 $1$ 表示数字字符 $i$ 出现奇数次,为 $0$ 表示数字字符 $i$ 出现偶数次。
64+
65+
而如果子字符串 $s[j,..i]$ 是“超赞字符串”,那么前缀字符串 $s[0,..i]$ 的状态 $st$ 与前缀字符串 $s[0,..j-1]$ 的状态 $st'$ 的二进制位中,最多只有一位不同。这是因为,二进制位不同,表示奇偶性不同,而奇偶性不同,就意味着子字符串 $s[j,..i]$ 中该数字出现的次数为奇数次。
66+
67+
所以,我们可以用哈希表或数组记录所有状态 $st$ 第一次出现的位置。若当前前缀字符串的状态 $st$ 在哈希表中已经存在,那么说明当前前缀字符串的状态 $st$ 与前缀字符串 $s[0,..j-1]$ 的状态 $st'$ 的二进制位中,所有位都相同,即子字符串 $s[j,..i]$ 是“超赞字符串”,更新答案的最大值。或者,我们可以枚举每一位,将当前前缀字符串的状态 $st$ 的第 $i$ 位取反,即 $st \oplus (1 << i)$,然后判断 $st \oplus (1 << i)$ 是否在哈希表中,若在,那么说明当前前缀字符串的状态 $st$ 与前缀字符串 $s[0,..j-1]$ 的状态 $st' \oplus (1 << i)$ 的二进制位中,只有第 $i$ 位不同,即子字符串 $s[j,..i]$ 是“超赞字符串”,更新答案的最大值。
68+
69+
最后,返回答案即可。
70+
71+
时间复杂度 $O(n \times C)$,空间复杂度 $O(2^C)$。其中 $n$ 和 $C$ 分别为字符串 $s$ 的长度和数字字符的种类数。
72+
5973
<!-- tabs:start -->
6074

6175
### **Python3**
6276

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

6579
```python
66-
80+
class Solution:
81+
def longestAwesome(self, s: str) -> int:
82+
st = 0
83+
d = {0: -1}
84+
ans = 1
85+
for i, c in enumerate(s):
86+
v = int(c)
87+
st ^= 1 << v
88+
if st in d:
89+
ans = max(ans, i - d[st])
90+
else:
91+
d[st] = i
92+
for v in range(10):
93+
if st ^ (1 << v) in d:
94+
ans = max(ans, i - d[st ^ (1 << v)])
95+
return ans
6796
```
6897

6998
### **Java**
7099

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

73102
```java
103+
class Solution {
104+
public int longestAwesome(String s) {
105+
int[] d = new int[1024];
106+
int st = 0, ans = 1;
107+
Arrays.fill(d, -1);
108+
d[0] = 0;
109+
for (int i = 1; i <= s.length(); ++i) {
110+
int v = s.charAt(i - 1) - '0';
111+
st ^= 1 << v;
112+
if (d[st] >= 0) {
113+
ans = Math.max(ans, i - d[st]);
114+
} else {
115+
d[st] = i;
116+
}
117+
for (v = 0; v < 10; ++v) {
118+
if (d[st ^ (1 << v)] >= 0) {
119+
ans = Math.max(ans, i - d[st ^ (1 << v)]);
120+
}
121+
}
122+
}
123+
return ans;
124+
}
125+
}
126+
```
127+
128+
### **C++**
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
int longestAwesome(string s) {
134+
vector<int> d(1024, -1);
135+
d[0] = 0;
136+
int st = 0, ans = 1;
137+
for (int i = 1; i <= s.size(); ++i) {
138+
int v = s[i - 1] - '0';
139+
st ^= 1 << v;
140+
if (~d[st]) {
141+
ans = max(ans, i - d[st]);
142+
} else {
143+
d[st] = i;
144+
}
145+
for (v = 0; v < 10; ++v) {
146+
if (~d[st ^ (1 << v)]) {
147+
ans = max(ans, i - d[st ^ (1 << v)]);
148+
}
149+
}
150+
}
151+
return ans;
152+
}
153+
};
154+
```
74155
156+
### **Go**
157+
158+
```go
159+
func longestAwesome(s string) int {
160+
d := [1024]int{}
161+
d[0] = 1
162+
st, ans := 0, 1
163+
for i, c := range s {
164+
i += 2
165+
st ^= 1 << (c - '0')
166+
if d[st] > 0 {
167+
ans = max(ans, i-d[st])
168+
} else {
169+
d[st] = i
170+
}
171+
for v := 0; v < 10; v++ {
172+
if d[st^(1<<v)] > 0 {
173+
ans = max(ans, i-d[st^(1<<v)])
174+
}
175+
}
176+
}
177+
return ans
178+
}
179+
180+
func max(a, b int) int {
181+
if a > b {
182+
return a
183+
}
184+
return b
185+
}
75186
```
76187

77188
### **...**

solution/1500-1599/1542.Find Longest Awesome Substring/README_EN.md

+98-1
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,110 @@
4747
### **Python3**
4848

4949
```python
50-
50+
class Solution:
51+
def longestAwesome(self, s: str) -> int:
52+
st = 0
53+
d = {0: -1}
54+
ans = 1
55+
for i, c in enumerate(s):
56+
v = int(c)
57+
st ^= 1 << v
58+
if st in d:
59+
ans = max(ans, i - d[st])
60+
else:
61+
d[st] = i
62+
for v in range(10):
63+
if st ^ (1 << v) in d:
64+
ans = max(ans, i - d[st ^ (1 << v)])
65+
return ans
5166
```
5267

5368
### **Java**
5469

5570
```java
71+
class Solution {
72+
public int longestAwesome(String s) {
73+
int[] d = new int[1024];
74+
int st = 0, ans = 1;
75+
Arrays.fill(d, -1);
76+
d[0] = 0;
77+
for (int i = 1; i <= s.length(); ++i) {
78+
int v = s.charAt(i - 1) - '0';
79+
st ^= 1 << v;
80+
if (d[st] >= 0) {
81+
ans = Math.max(ans, i - d[st]);
82+
} else {
83+
d[st] = i;
84+
}
85+
for (v = 0; v < 10; ++v) {
86+
if (d[st ^ (1 << v)] >= 0) {
87+
ans = Math.max(ans, i - d[st ^ (1 << v)]);
88+
}
89+
}
90+
}
91+
return ans;
92+
}
93+
}
94+
```
95+
96+
### **C++**
97+
98+
```cpp
99+
class Solution {
100+
public:
101+
int longestAwesome(string s) {
102+
vector<int> d(1024, -1);
103+
d[0] = 0;
104+
int st = 0, ans = 1;
105+
for (int i = 1; i <= s.size(); ++i) {
106+
int v = s[i - 1] - '0';
107+
st ^= 1 << v;
108+
if (~d[st]) {
109+
ans = max(ans, i - d[st]);
110+
} else {
111+
d[st] = i;
112+
}
113+
for (v = 0; v < 10; ++v) {
114+
if (~d[st ^ (1 << v)]) {
115+
ans = max(ans, i - d[st ^ (1 << v)]);
116+
}
117+
}
118+
}
119+
return ans;
120+
}
121+
};
122+
```
56123
124+
### **Go**
125+
126+
```go
127+
func longestAwesome(s string) int {
128+
d := [1024]int{}
129+
d[0] = 1
130+
st, ans := 0, 1
131+
for i, c := range s {
132+
i += 2
133+
st ^= 1 << (c - '0')
134+
if d[st] > 0 {
135+
ans = max(ans, i-d[st])
136+
} else {
137+
d[st] = i
138+
}
139+
for v := 0; v < 10; v++ {
140+
if d[st^(1<<v)] > 0 {
141+
ans = max(ans, i-d[st^(1<<v)])
142+
}
143+
}
144+
}
145+
return ans
146+
}
147+
148+
func max(a, b int) int {
149+
if a > b {
150+
return a
151+
}
152+
return b
153+
}
57154
```
58155

59156
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int longestAwesome(string s) {
4+
vector<int> d(1024, -1);
5+
d[0] = 0;
6+
int st = 0, ans = 1;
7+
for (int i = 1; i <= s.size(); ++i) {
8+
int v = s[i - 1] - '0';
9+
st ^= 1 << v;
10+
if (~d[st]) {
11+
ans = max(ans, i - d[st]);
12+
} else {
13+
d[st] = i;
14+
}
15+
for (v = 0; v < 10; ++v) {
16+
if (~d[st ^ (1 << v)]) {
17+
ans = max(ans, i - d[st ^ (1 << v)]);
18+
}
19+
}
20+
}
21+
return ans;
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func longestAwesome(s string) int {
2+
d := [1024]int{}
3+
d[0] = 1
4+
st, ans := 0, 1
5+
for i, c := range s {
6+
i += 2
7+
st ^= 1 << (c - '0')
8+
if d[st] > 0 {
9+
ans = max(ans, i-d[st])
10+
} else {
11+
d[st] = i
12+
}
13+
for v := 0; v < 10; v++ {
14+
if d[st^(1<<v)] > 0 {
15+
ans = max(ans, i-d[st^(1<<v)])
16+
}
17+
}
18+
}
19+
return ans
20+
}
21+
22+
func max(a, b int) int {
23+
if a > b {
24+
return a
25+
}
26+
return b
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public int longestAwesome(String s) {
3+
int[] d = new int[1024];
4+
int st = 0, ans = 1;
5+
Arrays.fill(d, -1);
6+
d[0] = 0;
7+
for (int i = 1; i <= s.length(); ++i) {
8+
int v = s.charAt(i - 1) - '0';
9+
st ^= 1 << v;
10+
if (d[st] >= 0) {
11+
ans = Math.max(ans, i - d[st]);
12+
} else {
13+
d[st] = i;
14+
}
15+
for (v = 0; v < 10; ++v) {
16+
if (d[st ^ (1 << v)] >= 0) {
17+
ans = Math.max(ans, i - d[st ^ (1 << v)]);
18+
}
19+
}
20+
}
21+
return ans;
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def longestAwesome(self, s: str) -> int:
3+
st = 0
4+
d = {0: -1}
5+
ans = 1
6+
for i, c in enumerate(s):
7+
v = int(c)
8+
st ^= 1 << v
9+
if st in d:
10+
ans = max(ans, i - d[st])
11+
else:
12+
d[st] = i
13+
for v in range(10):
14+
if st ^ (1 << v) in d:
15+
ans = max(ans, i - d[st ^ (1 << v)])
16+
return ans

0 commit comments

Comments
 (0)