이진 문자열 s와 정수 k가 있다고 가정합니다. 길이가 k인 모든 이진 코드가 s의 부분 문자열인지 확인해야 합니다. 그렇지 않으면 False를 반환합니다.
따라서 입력이 S ="00110110", k =2와 같으면 출력은 true가 됩니다. 길이가 2인 바이너리 코드는 "00", "01", "10" 및 "11"입니다. 이들은 각각 인덱스 0, 1, 3, 2에 있습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
한 세트 v
정의 -
temp :=빈 문자열
-
필요 :=2^k
-
initialize i :=0의 경우 i
-
온도 :=온도 + s[i]
-
i>=k이면 -
-
temp의 첫 번째 인덱스에서 한 문자 삭제
-
-
i>=k - 1이면 -
-
v
에 temp 삽입
-
-
v의 크기가 req와 같으면 -
-
true를 반환
-
-
-
거짓을 반환
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
lli fastPow(lli b, lli p){
lli ret = 1;
while (p) {
if (p & 1) {
ret *= b;
}
b *= b;
p >>= 1;
}
return ret;
}
bool hasAllCodes(string s, int k) {
unordered_set<string> v;
string temp = "";
lli req = fastPow(2, k);
for (lli i = 0; i < s.size(); i++) {
temp += s[i];
if (i >= k) {
temp.erase(0, 1);
}
if (i >= k - 1) {
v.insert(temp);
}
if ((lli)v.size() == req)
return true;
}
return false;
}
};
main(){
Solution ob;
cout << (ob.hasAllCodes("00110110",2));
} 입력
"00110110",2
출력
1