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 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)

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