給你乙個字串 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陣...