76. 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:
输入:s = "a", t = "a"
输出:"a"
提示:
1 <= s.length, t.length <= 105
s 和 t 由英文字母组成
进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
wa
class Solution: def minWindow(self, s: str, t: str) -> str: ls=len(s) lt=len(t) if ls<lt:return '' if s==t:return s def check(a,b): cnta=collections.Counter(a) cntb=collections.Counter(b) for i in cntb.keys(): if i not in cnta.keys(): return False else: if cnta[i]<cntb[i]: return False return True if ls==lt:return s if check(s,t) else '' if not check(s,t):return '' l,r=0,ls while l<r: if check(s[l+1:r],t): l+=1 elif check(s[l:r-1],t): r-=1 else: res1=s[l:r] break l,r=0,ls while l<r: if check(s[l:r-1],t): r-=1 elif check(s[l+1:r],t): l+=1 else: res2=s[l:r] break return res1 if len(res1)<len(res2) else res2
ac
class Solution: def minWindow(self, s, t): cnt=collections.Counter(t) lt=len(t) start=0 minSize=99999 l=0 for end in range(len(s)): if s[end] in cnt: cnt[s[end]]-=1 if cnt[s[end]]>=0: lt-=1 if lt==0: while True: if s[start] in cnt: if cnt[s[start]]<0: cnt[s[start]]+=1 else: break start+=1 if minSize>end-start+1: minSize=end-start+1 l=start return '' if minSize==99999 else s[l:l+minSize]