检查一个字符串是否包含所有长度为K的二进制子串
1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 - 力扣(LeetCode)
Solution
两种做法,第一种是滑动窗口枚举长度为k的子串,每次都把子串加入到一个unordered_set中,最后判断这个集合的大小是否等于2的k次方即可。
第二种与第一种类似,只不过优化了滑动过程,把窗口内的元素当成一个整数,也是加入到一个unordered_set中,最后判断大小是否为2^k。
class Solution {
public:// 直接哈希的做法bool hasAllCodes1(string s, int k) {int n = s.length();int num = 1 << k;if (n < num + k - 1)return false;unordered_set<string> found_strings;for (int r = 0; r < n; ++r) {int l = r - k + 1;if (l >= 0) {string temp = s.substr(l, r - l + 1);found_strings.insert(temp);if (found_strings.size() == num)return true;}}return found_strings.size() == num;}// 更优化一些的做法bool hasAllCodes(string s, int k) {int n = s.length();int num = 1 << k;int m = 1 << (k - 1);if (n < num + k - 1)return false;unordered_set<int> found_nums;int current_num = 0;for (int r = 0; r < n; ++r) {// char current_char = s[r];// int current_bit = current_char - 'a';current_num = current_num * 2 + s[r] - '0';// cout << current_num << " ";int l = r - k + 1;if (l >= 0) {found_nums.insert(current_num);}if (found_nums.size() == num)return true;if (l >= 0) {current_num -= (s[l] - '0') * m;}// if (l >= 0) {// string temp = s.substr(l, r - l + 1);// found_strings.insert(temp);// if (found_strings.size() == num)// return true;// }}// cout << endl;// for (auto it = found_nums.begin(); it != found_nums.end(); ++it)// cout << *it << " ";return found_nums.size() == num;}
};