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

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;00110110&quot;, k = 2
<strong>Output:</strong> true
<strong>Explanation:</strong> The binary codes of length 2 are &quot;00&quot;, &quot;01&quot;, &quot;10&quot; and &quot;11&quot;. They can be all found as substrings at indices 0, 1, 3 and 2 respectively.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;0110&quot;, k = 1
<strong>Output:</strong> true
<strong>Explanation:</strong> The binary codes of length 1 are &quot;0&quot; and &quot;1&quot;, it is clear that both exist as a substring. 
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;0110&quot;, k = 2
<strong>Output:</strong> false
<strong>Explanation:</strong> The binary code &quot;00&quot; is of length 2 and does not exist in the array.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 5 * 10<sup>5</sup></code></li>
	<li><code>s[i]</code> is either <code>&#39;0&#39;</code> or <code>&#39;1&#39;</code>.</li>
	<li><code>1 &lt;= k &lt;= 20</code></li>
</ul>

class Solution:
    def hasAllCodes(self, s: str, k: int) -> bool:
        if k >= 19: return False
        can = [0] * 500000
        for i in range(len(s)):
            if i + k > len(s): break
            cur = s[i: i + k]
            num = 0
            for j in range(len(cur)):
                num *= 2
                num += int(cur[j])
            #print(num)
            can[num] = 1
        for i in range(2 ** k):
            if can[i] == 0:
                print("false here", i)
                return False
        return True

        #print(2 ** 19)
        # first 7 and half minute read question wrong. Substring
        # mark0, mark1 = False, False
        # ans = 0
        # for i in range(len(s)):
        #     if s[i] == '0':
        #         mark0 = True
        #     elif s[i] == '1':
        #         mark1 = True
        #     if mark0 and mark1:
        #         ans += 1
        #         mark0, mark1 = False, False
        #     print(i, mark0, mark1)
        # if ans >= k: return True
        # return False
24200