leetcode 32 最小覆蓋子集

2022-06-13 03:33:13 字數 1655 閱讀 5831

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

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

輸出:"banc"

如果 s 中不存這樣的子串,則返回空字串 ""。

如果 s 中存在這樣的子串,我們保證它是唯一的答案。

from collections import defaultdict

class solution:

def minwindow(self, s: str, t: str) -> str:

sets = set([chr for chr in t])

maps = defaultdict(lambda :0)

needs = defaultdict(lambda: 0)

for each in t:

needs[each] +=1

up = 0

down = 0

if s[0] in sets:

maps[s[0]] +=1

def check():

for each in sets:

if each in maps.keys() and maps[each]>=needs[each]:

pass

else:

return false

return true

min_len = 1<<31

min_up, min_down = 0,0

if check():

return ''.join([ch for ch in sets])

while not check() and downdown-up+1:

min_up = up

min_down = down

min_len = down-up+1

maps[s[up]]-=1

up += 1

if min_len>len(s):

return ''

return s[min_up:min_down+1]

更好的check方式
from collections import defaultdict

class solution:

def minwindow(self, s: str, t: str) -> str:

need=defaultdict(int)

for c in t:

need[c]+=1

needcnt=len(t)

i=0res=(0,float('inf'))

for j,c in enumerate(s):

if need[c]>0:

needcnt-=1

need[c]-=1

if needcnt==0: #步驟一:滑動視窗包含了所有t元素

while true: #步驟二:增加i,排除多餘元素

c=s[i]

if need[c]==0:

break

need[c]+=1

i+=1

if j-ilen(s) else s[res[0]:res[1]+1]

LeetCode 最小覆蓋子串

q 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。a 引用 labuladong的演算法...

LeetCode76 最小覆蓋子串

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

leetcode 76 最小覆蓋子串

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