Python程序:查找包含给定子字符串的最小字符串大小
假设我们有两个字符串 s 和 t,我们需要找到 s 中包含 t 中所有字符的最小子字符串的大小。如果不存在这样的子字符串,则返回 -1。
因此,如果输入类似于 s = "thegrumpywizardmakes" t = "wake",则输出将为 10,因为包含 "wake" 的最短子字符串是 "wizardmake"(长度为 10)。
为了解决这个问题,我们将遵循以下步骤:
counter := b 中每个字符的频率
start := 0
min_subs := 无穷大
rem := b 中不同字符的数量
对于 end 从 0 到 a 的大小,执行以下操作:
current := a[end]
如果 current 在 counter 中,则:
counter[current] := counter[current] - 1
如果 counter[current] 等于 0,则:
rem := rem - 1
当 rem 等于 0 时,执行以下操作:
prev_char := a[start]
如果 prev_char 在 counter 中,则:
counter[prev_char] := counter[prev_char] + 1
如果 counter[prev_char] > 0,则:
rem := rem + 1
min_subs := min_subs 和 (end - start + 1) 的最小值
start := start + 1
当 min_subs 不为无穷大时返回 min_subs,否则返回 -1
示例(Python)
让我们看看以下实现以更好地理解:
class Solution: def solve(self, a, b): counter = {} for char in b: counter[char] = counter.get(char, 0) + 1 start = 0 min_subs = float("inf") rem = len(counter) for end in range(len(a)): current = a[end] if current in counter: counter[current] -= 1 if counter[current] == 0: rem -= 1 while rem == 0: prev_char = a[start] if prev_char in counter: counter[prev_char] += 1 if counter[prev_char] > 0: rem += 1 min_subs = min(min_subs, end - start + 1) start += 1 return min_subs if min_subs != float("inf") else -1 ob = Solution() s = "thegrumpywizardmakes" t = "wake" print(ob.solve(s, t))
输入
"thegrumpywizardmakes", "wake"
输出
2
广告