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

更新于: 2020-12-21

346 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告