0. 总结

  • 如果将滑动窗口视作是双指针,本题也是双指针的一个应用。对于这种求最短子串的题几乎都是用滑动窗口来解。这个好像是LeetCode上的一个同学做出的总结。

1.1 题目

1.2 分析

  • 设定两个指针left,right,初始值均为0。right递增,找出第一个满足条件的子串,记录窗口长度值。
  • 不停的迭代更新left值(增一),更新窗口大小。

主要有如下几个问题需要注意:

  • 条件的满足是怎么判断的?
  • 使用dict 判断二者的个数,因为是26个英文字符,所以一次循环即可。

1.3 代码

class Solution:
def minWindow(self, s: str, t: str) -> str:
if len(s) < len(t):
return ""
stan = {}
# 先把标注答案找到
for i in range(len(t)):
if t[i] not in stan.keys():
stan[t[i]]=1
else:
stan[t[i]]+=1

wind = {}
res = 999999
out = ""
left,right =0,0 # 窗口值
while(right < len(s)):
# for i in range(len(s)):
c = s[right]
if c not in wind.keys():
wind[c] = 0
wind[c] += 1

while self.judge(stan,wind):
if right-left +1 < res:
out = s[left:right+1]
res = min(res,right-left+1)
wind[s[left]] -= 1 # 对应的字符减一
left += 1
right+=1
# print(res)
print(out)

# 判断二者是否重合
def judge(self,stan,wind):
flag = 0
for item in stan.items():
c,num = item # 得到字符和次数
if wind.get(c,0) < num:
flag = 1
break
if flag:
return False
return True

s = "ADOBECODEBANC"
t = "ABC"
so = Solution()
so.minWindow(s,t)

kandoa