Given a binary string s and an integer k, return trueif every binary code of lengthkis a substring ofs. Otherwise, return false.
Example 1:
Input: s = "00110110", k = 2
Output: true
Explanation: The binary codes of length 2 are "00", "01", "10" and "11". They can be all found as substrings at indices 0, 1, 3 and 2 respectively.
Example 2:
Input: s = "0110", k = 1
Output: true
Explanation: The binary codes of length 1 are "0" and "1", it is clear that both exist as a substring.
Example 3:
Input: s = "0110", k = 2
Output: false
Explanation: The binary code "00" is of length 2 and does not exist in the array.
Constraints:
1 <= s.length <= 5 * 105
s[i] is either '0' or '1'.
1 <= k <= 20
Solutions
Solution 1: Hash Table
First, for a string \(s\) of length \(n\), the number of substrings of length \(k\) is \(n - k + 1\). If \(n - k + 1 < 2^k\), then there must exist a binary string of length \(k\) that is not a substring of \(s\), so we return false.
Next, we traverse the string \(s\) and store all substrings of length \(k\) in a set \(ss\). Finally, we check if the size of the set \(ss\) is equal to \(2^k\).
The time complexity is \(O(n \times k)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the string \(s\).
In Solution 1, we stored all distinct substrings of length \(k\), and processing each substring requires \(O(k)\) time. We can instead use a sliding window, where each time we add the latest character, we remove the leftmost character from the window. During this process, we use an integer \(x\) to store the substring.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the string \(s\).