题目:
76.最小覆盖子串
思路:
滑动窗口。关键在于判断窗口中的字符串是否包含T中所有字母from collections import Counter
class Solution:def minWindow(self, s: str, t: str) -> str:def is_contained(window, t):# dictwindow = dict(window)t = dict(t)for t_key, t_val in t.items():if window.__contains__(t_key):if window[t_key] < t_val:return Falseelse:return Falsereturn Truet = Counter(t)left = right = 0window = {}min_substr = list(s)while right < len(s):window[s[right]] = window.get(s[right], 0) + 1while is_contained(window, t):if right-left+1 <= len(min_substr):min_substr = s[left:right+1]window[s[left]] -= 1left += 1right += 1return min_substr if type(min_substr) is str else ''
超时做法
class Solution:def minWindow(self, s: str, t: str) -> str:def is_contained(sub_s, t):sub_s = list(sub_s)for c in t:if c in sub_s[:]:sub_s.remove(c)else:return Falseelse:return Trueleft = 0right = 0min_substr = sFlag = Falsewhile right < len(s):right += 1while is_contained(s[left:right], t) and left < right:print('ok')if len(s[left:right]) <= len(min_substr):print('fuzhi')min_substr = s[left:right]Flag = Trueprint(min_substr)left += 1return min_substr if Flag else ''
别人简洁的代码
class Solution:def minWindow(self, s: str, t: str) -> str:ans=''l=0minn=99999d=Counter(t)dd=defaultdict(int)for i in range(len(s)):dd[s[i]]+=1while involve(d,dd):if i-l<minn:minn=i-lans=s[l:i+1]dd[s[l]]-=1l+=1return ansdef involve(a,b):for k,v in a.items():if k not in b or b[k]<v:return Falsereturn True作者:cpf_china链接:https://leetcode-cn.com/problems/minimum-window-substring/solution/python3-by-cpf_china-10/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
