File tree Expand file tree Collapse file tree
LeetCode/medium/1461. Check If a String Contains All Binary Codes of Size K Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ # 1461. Check If a String Contains All Binary Codes of Size K
2+
3+ [ 링크] ( https://leetcode.com/problems/check-if-a-string-contains-all-binary-codes-of-size-k/description/ )
4+
5+ | 난이도 |
6+ | :----: |
7+ | Medium |
8+
9+ ## 설계
10+
11+ ### 시간 복잡도
12+
13+ 문자열의 길이를 N, 입력받은 수를 K라 하자.
14+
15+ 슬라이딩 윈도우를 사용해 각 K길이의 문자열을 확인할 수 있다.
16+
17+ 이를 hash set을 이용할 경우 O(N \* K)의 시간 복잡도를 사용한다.
18+
19+ 각 비트셋을 숫자로 변환해 저장할 수 있다. 이 경우 O(N)의 시간 복잡도를 사용한다.
20+
21+ ### 공간 복잡도
22+
23+ hash set, 비트셋에 O(2^K)의 공간 복잡도를 사용한다.
24+
25+ ### 슬라이딩 윈도우 & 비트셋
26+
27+ | 내 코드 (ms) | 시간 복잡도 | 공간 복잡도 |
28+ | :----------: | :---------: | :---------: |
29+ | 16 | O(N) | O(2^K) |
30+
31+ 길이가 K인 문자열을 숫자로 변환해 저장한다.
32+
33+ 한칸씩 이동하므로 비트를 이동 후 현재 비트를 더한 숫자를 만든 뒤 2^K로 나눈 나머지를 이용해 윈도우를 저장한다.
34+
35+ 각 윈도우마다 방문 여부를 별도 배열로 저장한다.
36+
37+ 이후 방문한 윈도우의 종류가 2^K와 같은지 확인한다.
38+
39+ ``` cpp
40+ bool hasAllCodes (string s, int k) {
41+ int size = s.size();
42+ if (size < k) return false;
43+
44+ int limit = 1 << k;
45+ bool visited[ 1048576] = {false};
46+ int visitCount = 0;
47+
48+ int temp = 0;
49+ for (int i = 0; i < k - 1; i++) {
50+ temp = temp * 2 + (s[ i] - '0');
51+ }
52+ for (int i = k - 1; i < size; i++) {
53+ temp = temp * 2 + (s[ i] - '0');
54+
55+ temp %= limit;
56+ if (visited[temp] == false) visitCount++;
57+ visited[temp] = true;
58+ }
59+
60+ return visitCount == limit;
61+ }
62+ ```
63+
64+ ## 고생한 점
Original file line number Diff line number Diff line change 1+ #include < algorithm>
2+ #include < climits>
3+ #include < cmath>
4+ #include < cstring>
5+ #include < functional>
6+ #include < iostream>
7+ #include < map>
8+ #include < numeric>
9+ #include < queue>
10+ #include < set>
11+ #include < stack>
12+ #include < string>
13+ #include < unordered_map>
14+ #include < unordered_set>
15+ #include < vector>
16+
17+ using namespace std ;
18+
19+ // sliding window & bitset
20+ // time : O(N)
21+ // space : O(2^K)
22+ class Solution {
23+ public:
24+ bool hasAllCodes (string s, int k) {
25+ int size = s.size ();
26+ if (size < k) return false ;
27+
28+ int limit = 1 << k;
29+ bool visited[1048576 ] = {false };
30+ int visitCount = 0 ;
31+
32+ int temp = 0 ;
33+ for (int i = 0 ; i < k - 1 ; i++) {
34+ temp = temp * 2 + (s[i] - ' 0' );
35+ }
36+ for (int i = k - 1 ; i < size; i++) {
37+ temp = temp * 2 + (s[i] - ' 0' );
38+
39+ temp %= limit;
40+ if (visited[temp] == false ) visitCount++;
41+ visited[temp] = true ;
42+ }
43+
44+ return visitCount == limit;
45+ }
46+ };
Original file line number Diff line number Diff line change 1+ Input: s = "00110110", k = 2
2+ Output: true
3+
4+ ===
5+
6+ Input: s = "0110", k = 1
7+ Output: true
8+
9+ ===
10+
11+ Input: s = "0110", k = 2
12+ Output: false
You can’t perform that action at this time.
0 commit comments