题目描述
输入样例
思路
双指针搜索。
- 初始化左右指针指向第一个元素
- 不断移动右指针直到包含T中所有的字符,
- 移动左指针,每移动一次左指针检查是否仍然包含T中的所有字符,如果包含就更新记录的最小窗口的起始位置和大小,直到不再包含T中的所有字符
- 继续移动右指针,重复上述过程
代码
def getsubstring(S, T):
'''
找到S中包含T的最短字串
:param S:
:param T:
:return:
'''
# 统计T中每个字符出现的次数
dct = dict()
for ele in T:
if dct.get(ele) is None:
dct[ele] = 1
else:
dct[ele] = dct[ele] + 1
# 左右指针
left = 0
right = 0
# 计数,用于检查是否存在一个T
cnt = 0
# 最小窗口大小
minSize = len(S)
# 最小窗口的起始位置
begin = 0
while left <= right and right < len(S):
if dct.get(S[right]) is not None:
if dct.get(S[right]) > 0:
cnt += 1
dct[S[right]] = dct[S[right]] - 1
# 说明包含一个T,移动左指针
if cnt == len(T):
if right - left + 1 < minSize:
begin = left
if dct.get(S[left]) is not None:
dct[S[left]] = dct[S[left]] + 1
if dct[S[left]] > 0:
cnt = cnt - 1
# cnt < Len(T), 说明要移动右指针
right = right + 1
# 移动左指针
left = left + 1
continue
right = right + 1
return S[begin:begin + minSize]