• 難度分: 1504
  • 比較簡單的解法,使用 unordered_set
class Solution {
public:
    bool hasAllCodes(string s, int k) {
        unordered_set<string> set;
        for (int i = 0; i + k <= s.size(); i++) {
            set.insert(s.substr(i, k));
        }
        return set.size() == pow(2, k);
    }
};
  • 使用 sliding window,並運用移位運算子
class Solution {
public:
    bool hasAllCodes(string s, int k) {
        if (s.size() < k) return false;
        int n = pow(2, k);
        vector<bool> used(n, false);
        int curr = 0;
        for (int i = 0; i < k; i++) {
            curr <<= 1;
            curr += (s[i] - '0');
        }
        used[curr] = true;
        for (int i = k; i < s.size(); i++) {
            curr <<= 1;
            curr += (s[i] - '0');
            curr %= n;
            used[curr] = true;
        }
        return all_of(used.begin(), used.end(), [](int x) { return x; });
    }
};