滑動視窗 LeetCode76 最小覆蓋子串

2021-10-08 20:52:11 字數 1721 閱讀 1210

給你乙個字串 s、乙個字串 t 。請你設計一種演算法,可以在 o(n) 的時間複雜度內,從字串 s 裡面找出:包含 t 所有字元的最小子串

輸入:s = "adobecodebanc", t = "abc"

輸出:"banc"

左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動

# 最短子串開始位置和長度

start = 0

min_len = float('inf')

left, right = 0, 0

# 兩個計數器

needs = counter(t)

# print(needs) # counter()

# print(len(needs)) # 3

window = defaultdict(int)

# defaultdict(int)在訪問的key不存在的時候返回預設值0, 可以減少一次邏輯判斷

# list對應[ ],str對應的是空字串,set對應set( ),int對應0

match = 0 # 表示視窗中滿足need條件的字元個數

while right < len(s):

c1 = s[right] # 將移入視窗的字元

if needs[c1] > 0:

window[c1] += 1 # 如果乙個字元進入視窗,應該增加window計數器

if window[c1] == needs[c1]: # 發現某個字元在window的數量滿足了need的需要,就要更新match

match += 1 # 表示有乙個字元已經滿足要求

right += 1 # 右移視窗

# 當match == len(needs)時,說明t中所有字元已經被覆蓋,已經得到乙個可行的覆蓋子串,

# 現在應該開始"收縮視窗"了,以便得到「最小覆蓋子串」

# 判斷左側視窗是否要收縮

while match == len(needs):

if right - left < min_len:

# 更新最小子串長度

min_len = right - left

start = left

c2 = s[left] # 將移出視窗的字元

if needs[c2] > 0:

window[c2] -= 1 # 如果乙個字元將移出視窗的時候,應該減少window計數器

if window[c2] < needs[c2]:

match -= 1

left += 1 # 左移視窗

return s[start:start + min_len] if min_len != float("inf") else ""

s = "ebbancf"

t = "abc"

s = solution()

print(s.minwindow(s, t)) # 'banc'

leetcode76 最小覆蓋子串 滑動視窗

題目 思路 滑動視窗 使用new int 128 陣列儲存t中每個字元出現的次數 使用new int 128 陣列儲存視窗中每個字元出現的次數 使用minlength表示最小子串長度。使用count記錄目前視窗中的有效字元數,當count t.length 時,視窗長度為乙個包含t中所有字元的子串的...

LeetCode76 最小覆蓋子串

給定乙個字串 s 和乙個字串 t,請在 s 中找出包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 字串和雜湊表的問題。hashmap來儲存t字串中個字母元素的出現次數,left right記錄當前子字串的左右下標值,min minleft ...

leetcode 76 最小覆蓋子串

這道題我使用了很笨的方式花了好久解決了,但是時間複雜度太度,只看網上檢視原始碼,不得不說網上的答案基本都是一樣的,但是對於基礎相對薄弱的我來說這些 看起來很是費勁,還用要加強c 基礎的練習才行。思路相對來說不是很難 1 首先構架t字串的hash表,因為字元與ascii碼較好的關係,使用vector陣...