📅  最后修改于: 2023-12-03 14:58:27.562000             🧑  作者: Mango
在一个字符串中找到一个最小子串,使得这个子串中包含了指定的所有字符。
def find_shortest_substring(s: str, chars: str) -> str:
pass
s
:一个字符串。chars
:一个字符串,其中包含指定的字符。一个字符串,表示chars
中包含的所有字符的最短子串。
assert find_shortest_substring('this is a test string', 'tist') == 't stri'
chars
中每个字符加入到字典中,并初始化滑动窗口的左、右边界。def find_shortest_substring(s: str, chars: str) -> str:
char_map = {}
for c in chars:
char_map[c] = char_map.get(c, 0) + 1
left, right = 0, 0
min_length = float('inf')
min_start = 0
count = len(char_map)
while right < len(s):
c = s[right]
if c in char_map:
char_map[c] -= 1
if char_map[c] == 0:
count -= 1
right += 1
while count == 0:
if right - left < min_length:
min_length = right - left
min_start = left
c = s[left]
if c in char_map:
char_map[c] += 1
if char_map[c] > 0:
count += 1
left += 1
return s[min_start:min_start+min_length] if min_length != float('inf') else ''
时间复杂度:$O(S+C)$,其中 S
是字符串的长度,C
是字符集的大小。在最坏情况下,我们需要遍历整个字符串 s
以及字符集 chars
中的所有字符。
空间复杂度:$O(C)$,字典存储了字符集 chars
。