C++ 中檢查字串是否包含大小為 K 的所有二進位制程式碼
假設我們有一個二進位制字串 s 和一個整數 k。我們必須檢查長度為 k 的每個二進位制程式碼是否都是 s 的子字串。否則,返回 False。
因此,如果輸入類似於 S = "00110110",k = 2,則輸出將為 true。長度為 2 的二進位制程式碼為“00”、“01”、“10”和“11”。它們分別位於索引 0、1、3 和 2 處。
要解決此問題,我們將遵循以下步驟:
定義一個集合 v
temp := 空字串
req := 2^k
初始化 i := 0,當 i < s 的大小,更新(i 增加 1),執行:
temp := temp + s[i]
如果 i >= k,則:
從 temp 的第一個索引刪除一個字元
如果 i >= k - 1,則:
將 temp 插入 v
如果 v 的大小與 req 相同,則:
返回 true
返回 false
示例
讓我們看看以下實現以更好地理解:
#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
廣告