题目来自leetcode76最小覆盖字串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
先解释下字串和子序列的差别。字串一定是连续的,子序列可以连续。
一般对于子串问题的,什么包含之类的都可以选择滑动窗口解决,好了上代码。
class Solution:
def minWindow(self, s: str, t: str) -> str:
min_len = float('inf')
needle = dict((i,t.count(i)) for i in t)
window = {}
left = right = 0
match = 0
start = 0
while right<len(s):
c1 = s[right]
if c1 in needle:
window[c1] = window.get(c1,0)+1
if window[c1]==needle[c1]:
match+=1
right+=1
while match==len(needle):
if right-left<min_len:
min_len = right-left
start = left
c2 = s[left]
if c2 in window:
window[c2]-=1
if window[c2]<needle[c2]:
match-=1
left+=1
return '' if min_len==float('inf') else s[start:start+min_len]
好吧,就这样。