【LeetCode】1461. 檢查一個字符串是否包含所有長度爲 K 的二進制子串 Check If a String Contains All Binary Codes of Size K


題目地址:https://leetcode-cn.com/problems/check-if-a-string-contains-all-binary-codes-of-size-k/

題目描述

給你一個二進制字符串 s 和一個整數 k 。

如果所有長度爲 k 的二進制字符串都是 s 的子串,請返回 True ,否則請返回 False 。

示例 1:

輸入:s = "00110110", k = 2
輸出:true
解釋:長度爲 2 的二進制串包括 "00","01","10" 和 "11"。它們分別是 s 中下標爲 0,1,3,2 開始的長度爲 2 的子串。

示例 2:

輸入:s = "00110", k = 2
輸出:true

示例 3:

輸入:s = "0110", k = 1
輸出:true
解釋:長度爲 1 的二進制串包括 "0" 和 "1",顯然它們都是 s 的子串。

示例 4:

輸入:s = "0110", k = 2
輸出:false
解釋:長度爲 2 的二進制串 "00" 沒有出現在 s 中。

示例 5:

輸入:s = "0000000001011100", k = 4
輸出:false

提示:

  1. 1 <= s.length <= 5 * 10^5
  2. s 中只含 0 和 1 。
  3. 1 <= k <= 20

題目大意

檢查一個字符串是否包含所有長度爲 K 的二進制子串。

解題方法

統計長度爲 K 的子串個數

第一想法:把長度爲 K 的所有二進制全部找出來,然後判斷是否都在 s 中出現了。該方法的複雜度是 O(2^K * len(s)),大概是 10 ^ 11的級別,一定會超時。

所以反過來想, s 中長度爲 K 的所有不同的子串數目是否有 2 ^ K 個呢。如果是的話,說明 s 中包含所有長度爲 K 的二進制子串。

代碼是 set + 子字符串 實現的。

時間複雜度是 O(N*k),N 是 s 的長度,乘以 k 是截取獲得子字符串的操作時間複雜度。
空間複雜度是 O(2 ^ k)

Python 代碼如下:

class Solution(object):
    def hasAllCodes(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: bool
        """
        contains = set()
        N = len(s)
        for i in range(N - k + 1):
            contains.add(s[i:i + k])
        return len(contains) == (2 ** k)

歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!

日期

2020 年 5 月 31 日 —— 轉眼 5 月過去了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章