字节跳动后端面试题 字符串s1中包含s2所有字符的最短子串

这是2022年3.8日字节跳动后端面试的一个coding题
面试的时候我没有完全写出来,只是有思路,但debug不对
现在写出来仅作记录

题目:
给定两个字符串s1,s2,默认s1长度大于s2。
求出字符串s1中包含s2所有字符的最短子串

思路:
滑动窗口,具体见代码与注释
from collections import defaultdict

s1 = "akljbkcjalaklklbliopc"
s2 = "abc"

dct1 = defaultdict(int) # 存储s1的字符出现次数(字符得在s2中出现过才行)
dct2 = defaultdict(int) # 储存s2的所有字符出现次数
for i in s2:
    dct2[i] += 1

start = 0
end = 0
n = len(s1)
res = n
while end < n:
    if s1[end] in dct2: # 判断s1[end]字符在s2中出现过
        dct1[s1[end]] += 1
        if dct1[s1[end]] > dct2[s1[end]]: # s1[end]字符出现的次数多于s2中s1[end]出现的次数
            while dct1[s1[end]] > dct2[s1[end]]: # 从start开始减去符合 条件1 的字符
                if s1[start] in dct2: # 条件1
                    dct1[s1[start]] -= 1
                start += 1
    end += 1
    while dct1 == dct2: # 出现符合情况的子串
        res = min(end-start, res)
        if s1[start] in dct2:
            dct1[s1[start]] -= 1
        start += 1
print(res)

你可能感兴趣的:(leetcode,算法,职场和发展)