Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 112 additions & 1 deletion
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‎

Lines changed: 98 additions & 1 deletion
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
### **...**
Lines changed: 23 additions & 0 deletions
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+
};
Lines changed: 27 additions & 0 deletions
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+
}
Lines changed: 23 additions & 0 deletions
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+
}
Lines changed: 16 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /