- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址: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 <= s.length <= 5 * 10^5
s
中只含 0 和 1 。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 月過去了