Check if a String Contains All Binary Codes of Size K

medium string hash set sliding window bit manipulation

Problem

Given a binary string s and an integer k, return true if every binary code of length k is a substring of s. Otherwise, return false.

There are exactly 2^k distinct binary codes of length k. Collect every length-k substring of s into a set; if the set ends up holding all 2^k of them, the answer is true.

Inputs = "00110110", k = 2
Outputtrue
The length-2 substrings are 00, 01, 11, 10 — all four 2-bit codes appear.

def has_all_codes(s, k):
    need = 1 << k
    seen = set()
    for i in range(len(s) - k + 1):
        sub = s[i:i + k]
        if sub not in seen:
            seen.add(sub)
            if len(seen) == need:
                return True
    return len(seen) == need
function hasAllCodes(s, k) {
  const need = 1 << k;
  const seen = new Set();
  for (let i = 0; i + k <= s.length; i++) {
    const sub = s.slice(i, i + k);
    if (!seen.has(sub)) {
      seen.add(sub);
      if (seen.size === need) return true;
    }
  }
  return seen.size === need;
}
class Solution {
    public boolean hasAllCodes(String s, int k) {
        int need = 1 << k;
        Set<String> seen = new HashSet<>();
        for (int i = 0; i + k <= s.length(); i++) {
            String sub = s.substring(i, i + k);
            if (seen.add(sub) && seen.size() == need) {
                return true;
            }
        }
        return seen.size() == need;
    }
}
bool hasAllCodes(string s, int k) {
    int need = 1 << k;
    unordered_set<string> seen;
    for (int i = 0; i + k <= (int)s.size(); i++) {
        string sub = s.substr(i, k);
        seen.insert(sub);
        if ((int)seen.size() == need) return true;
    }
    return (int)seen.size() == need;
}
Time: O(n · k) Space: O(2^k · k)