Skip to content

Commit 52df4d5

Browse files
committed
feat: add solutions to lc problem: No.1461
No.1461.Check If a String Contains All Binary Codes of Size K
1 parent 2ffee30 commit 52df4d5

File tree

11 files changed

+434
-68
lines changed

11 files changed

+434
-68
lines changed

solution/0700-0799/0782.Transform to Chessboard/Solution.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ def f(mask, cnt):
2929
for j in range(n):
3030
curRowMask |= board[i][j] << j
3131
curColMask |= board[j][i] << j
32-
if curRowMask not in (rowMask, revRowMask) or curColMask not in (colMask, revColMask):
32+
if curRowMask not in (rowMask, revRowMask) or curColMask not in (
33+
colMask,
34+
revColMask,
35+
):
3336
return -1
3437
sameRow += curRowMask == rowMask
3538
sameCol += curColMask == colMask

solution/1300-1399/1339.Maximum Product of Splitted Binary Tree/Solution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@ def dfs(root):
2323
s = sum(root)
2424
ans = 0
2525
dfs(root)
26-
ans %= (10**9 + 7)
26+
ans %= 10**9 + 7
2727
return ans

solution/1400-1499/1460.Make Two Arrays Equal by Reversing Sub-arrays/README.md

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
**前言**
5959

60-
由于我们可以对 $arr$ 任意非空子数组进行翻转,也就意味着我们可以交换任何两个相邻元素,使得数组按特定的一种顺序排列。
60+
由于我们可以对 $arr$ 任意非空子数组进行翻转,也就意味着我们可以交换任意两个相邻元素,使得数组按特定的一种顺序排列。
6161

6262
因此,题目转换为:判断一个数组是否是另一个数组的排列。
6363

@@ -69,9 +69,9 @@
6969

7070
**方法二:数组/哈希表**
7171

72-
由于两数组的数据范围都是 $1 \leq x \leq 1000$,因此我们可以使用数组/哈希表来记录每个数字出现的次数
72+
由于两数组的数据范围都是 $1 \leq x \leq 1000$,因此我们可以使用数组或哈希表来记录每个数字出现的次数
7373

74-
时间复杂度 $O(n)$,空间复杂度 $O(n)$
74+
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 是数组 $arr$ 的长度,而 $C$ 是数组 $arr$ 元素的值域大小
7575

7676
<!-- tabs:start -->
7777

@@ -93,6 +93,16 @@ class Solution:
9393
return Counter(target) == Counter(arr)
9494
```
9595

96+
```python
97+
class Solution:
98+
def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
99+
cnt = [0] * 1001
100+
for a, b in zip(target, arr):
101+
cnt[a] += 1
102+
cnt[b] -= 1
103+
return all(v == 0 for v in cnt)
104+
```
105+
96106
### **Java**
97107

98108
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -123,6 +133,23 @@ class Solution {
123133
}
124134
```
125135

136+
```java
137+
class Solution {
138+
public boolean canBeEqual(int[] target, int[] arr) {
139+
int[] cnt = new int[1001];
140+
for (int v : target) {
141+
++cnt[v];
142+
}
143+
for (int v : arr) {
144+
if (--cnt[v] < 0) {
145+
return false;
146+
}
147+
}
148+
return true;
149+
}
150+
}
151+
```
152+
126153
### **C++**
127154

128155
```cpp
@@ -149,6 +176,18 @@ public:
149176
};
150177
```
151178

179+
```cpp
180+
class Solution {
181+
public:
182+
bool canBeEqual(vector<int>& target, vector<int>& arr) {
183+
vector<int> cnt(1001);
184+
for (int& v : target) ++cnt[v];
185+
for (int& v : arr) if (--cnt[v] < 0) return false;
186+
return true;
187+
}
188+
};
189+
```
190+
152191
### **Go**
153192
154193
```go
@@ -183,6 +222,22 @@ func canBeEqual(target []int, arr []int) bool {
183222
}
184223
```
185224

225+
```go
226+
func canBeEqual(target []int, arr []int) bool {
227+
cnt := make([]int, 1001)
228+
for _, v := range target {
229+
cnt[v]++
230+
}
231+
for _, v := range arr {
232+
cnt[v]--
233+
if cnt[v] < 0 {
234+
return false
235+
}
236+
}
237+
return true
238+
}
239+
```
240+
186241
### **C**
187242

188243
```c

solution/1400-1499/1460.Make Two Arrays Equal by Reversing Sub-arrays/README_EN.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,16 @@ class Solution:
6767
return Counter(target) == Counter(arr)
6868
```
6969

70+
```python
71+
class Solution:
72+
def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
73+
cnt = [0] * 1001
74+
for a, b in zip(target, arr):
75+
cnt[a] += 1
76+
cnt[b] -= 1
77+
return all(v == 0 for v in cnt)
78+
```
79+
7080
### **Java**
7181

7282
```java
@@ -95,6 +105,23 @@ class Solution {
95105
}
96106
```
97107

108+
```java
109+
class Solution {
110+
public boolean canBeEqual(int[] target, int[] arr) {
111+
int[] cnt = new int[1001];
112+
for (int v : target) {
113+
++cnt[v];
114+
}
115+
for (int v : arr) {
116+
if (--cnt[v] < 0) {
117+
return false;
118+
}
119+
}
120+
return true;
121+
}
122+
}
123+
```
124+
98125
### **C++**
99126

100127
```cpp
@@ -121,6 +148,18 @@ public:
121148
};
122149
```
123150

151+
```cpp
152+
class Solution {
153+
public:
154+
bool canBeEqual(vector<int>& target, vector<int>& arr) {
155+
vector<int> cnt(1001);
156+
for (int& v : target) ++cnt[v];
157+
for (int& v : arr) if (--cnt[v] < 0) return false;
158+
return true;
159+
}
160+
};
161+
```
162+
124163
### **Go**
125164
126165
```go
@@ -155,6 +194,22 @@ func canBeEqual(target []int, arr []int) bool {
155194
}
156195
```
157196

197+
```go
198+
func canBeEqual(target []int, arr []int) bool {
199+
cnt := make([]int, 1001)
200+
for _, v := range target {
201+
cnt[v]++
202+
}
203+
for _, v := range arr {
204+
cnt[v]--
205+
if cnt[v] < 0 {
206+
return false
207+
}
208+
}
209+
return true
210+
}
211+
```
212+
158213
### **C**
159214

160215
```c

solution/1400-1499/1461.Check If a String Contains All Binary Codes of Size K/README.md

Lines changed: 132 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,17 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51-
遍历字符串 s,用一个 set 存储所有长度为 k 的不同子串。只需要判断子串数能否达到 2<sup>k</sup> 即可。
51+
**方法一:哈希表**
52+
53+
遍历字符串 $s$,用一个哈希表存储所有长度为 $k$ 的不同子串。只需要判断子串数能否达到 $2^k$ 即可。
54+
55+
时间复杂度 $O(n \ times k)$,其中 $n$ 是字符串 $s$ 的长度,$k$ 是子串长度。
56+
57+
**方法二:滑动窗口**
58+
59+
方法一中,我们存储了所有长度为 $k$ 的不同子串,子串的处理需要 $O(k)$ 的时间,我们可以改用滑动窗口,每次添加最新字符时,删除窗口最左边的字符。此过程中用一个整型数字 $num$ 来存放子串。
60+
61+
时间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。
5262

5363
<!-- tabs:start -->
5464

@@ -59,15 +69,24 @@
5969
```python
6070
class Solution:
6171
def hasAllCodes(self, s: str, k: int) -> bool:
62-
counter = 1 << k
63-
exists = set()
64-
for i in range(k, len(s) + 1):
65-
if s[i - k : i] not in exists:
66-
exists.add(s[i - k : i])
67-
counter -= 1
68-
if counter == 0:
69-
return True
70-
return False
72+
ss = {s[i: i + k] for i in range(len(s) - k + 1)}
73+
return len(ss) == 1 << k
74+
```
75+
76+
```python
77+
class Solution:
78+
def hasAllCodes(self, s: str, k: int) -> bool:
79+
if len(s) - k + 1 < (1 << k):
80+
return False
81+
vis = [False] * (1 << k)
82+
num = int(s[:k], 2)
83+
vis[num] = True
84+
for i in range(k, len(s)):
85+
a = (ord(s[i - k]) - ord('0')) << (k - 1)
86+
b = ord(s[i]) - ord('0')
87+
num = ((num - a) << 1) + b
88+
vis[num] = True
89+
return all(v for v in vis)
7190
```
7291

7392
### **Java**
@@ -77,20 +96,112 @@ class Solution:
7796
```java
7897
class Solution {
7998
public boolean hasAllCodes(String s, int k) {
80-
int counter = 1 << k;
81-
Set<String> exists = new HashSet<>();
82-
for (int i = k; i <= s.length(); ++i) {
83-
String t = s.substring(i - k, i);
84-
if (!exists.contains(t)) {
85-
exists.add(t);
86-
--counter;
87-
}
88-
if (counter == 0) {
89-
return true;
99+
Set<String> ss = new HashSet<>();
100+
for (int i = 0; i < s.length() - k + 1; ++i) {
101+
ss.add(s.substring(i, i + k));
102+
}
103+
return ss.size() == 1 << k;
104+
}
105+
}
106+
```
107+
108+
```java
109+
class Solution {
110+
public boolean hasAllCodes(String s, int k) {
111+
int n = s.length();
112+
if (n - k + 1 < (1 << k)) {
113+
return false;
114+
}
115+
boolean[] vis = new boolean[1 << k];
116+
int num = Integer.parseInt(s.substring(0, k), 2);
117+
vis[num] = true;
118+
for (int i = k; i < n; ++i) {
119+
int a = (s.charAt(i - k) - '0') << (k - 1);
120+
int b = s.charAt(i) - '0';
121+
num = (num - a) << 1 | b;
122+
vis[num] = true;
123+
}
124+
for (boolean v : vis) {
125+
if (!v) {
126+
return false;
90127
}
91128
}
92-
return false;
129+
return true;
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
bool hasAllCodes(string s, int k) {
140+
unordered_set<string> ss;
141+
for (int i = 0; i + k <= s.size(); ++i) {
142+
ss.insert(move(s.substr(i, k)));
143+
}
144+
return ss.size() == 1 << k;
93145
}
146+
};
147+
```
148+
149+
```cpp
150+
class Solution {
151+
public:
152+
bool hasAllCodes(string s, int k) {
153+
int n = s.size();
154+
if (n - k + 1 < (1 << k)) return false;
155+
vector<bool> vis(1 << k);
156+
int num = stoi(s.substr(0, k), nullptr, 2);
157+
vis[num] = true;
158+
for (int i = k; i < n; ++i) {
159+
int a = (s[i - k] - '0') << (k - 1);
160+
int b = s[i] - '0';
161+
num = (num - a) << 1 | b;
162+
vis[num] = true;
163+
}
164+
for (bool v : vis) if (!v) return false;
165+
return true;
166+
}
167+
};
168+
```
169+
170+
### **Go**
171+
172+
```go
173+
func hasAllCodes(s string, k int) bool {
174+
ss := map[string]bool{}
175+
for i := 0; i+k <= len(s); i++ {
176+
ss[s[i:i+k]] = true
177+
}
178+
return len(ss) == 1<<k
179+
}
180+
```
181+
182+
```go
183+
func hasAllCodes(s string, k int) bool {
184+
n := len(s)
185+
if n-k+1 < (1 << k) {
186+
return false
187+
}
188+
vis := make([]bool, 1<<k)
189+
num := 0
190+
for i := 0; i < k; i++ {
191+
num = num<<1 | int(s[i]-'0')
192+
}
193+
vis[num] = true
194+
for i := k; i < n; i++ {
195+
a := int(s[i-k]-'0') << (k - 1)
196+
num = (num-a)<<1 | int(s[i]-'0')
197+
vis[num] = true
198+
}
199+
for _, v := range vis {
200+
if !v {
201+
return false
202+
}
203+
}
204+
return true
94205
}
95206
```
96207

0 commit comments

Comments
 (0)