📜  | |问题 12(1)

📅  最后修改于: 2023-12-03 14:48:43.848000             🧑  作者: Mango

'| |问题 12' 题目介绍

题目描述

| |问题 12 是一道经典的算法题目,题目给出两个字符串 st,要求找到 s 中最短的子串,使得该子串包含了 t 中所有字符。

问题分析

该问题可以使用滑动窗口算法(Sliding Window)来解决。

  1. 我们可以使用一个哈希表记录 t 中出现的字符以及出现次数。
  2. 然后,我们使用两个指针 leftright 分别指向 s 的开头和结尾,初始化的时候,两个指针都指向 s 的第一个字符。
  3. 接着,我们开始遍历 s,当右指针指向的字符出现在哈希表中时,将其出现次数减一。
  4. 如果该字符在哈希表中的出现次数变为了 0,说明已经找到了一个 t 中的字符,我们使用一个计数器 count 来记录当前找到的满足条件的字符数。
  5. count 等于 t 中字符数时,说明找到了一个满足条件的子串。
  6. 接着,我们需要移动左指针来寻找更短的子串,当左指针指向的字符出现在哈希表中时,将其出现次数加一。
  7. 如果该字符在哈希表中的出现次数大于 0,说明我们正在舍弃一个包含在条件字符串中的字符,此时,我们需要减少 count 的值。
  8. 在移动左指针的同时,我们更新当前子串的最小长度。
  9. 重复步骤 3 至 8,直到遍历完整个 s,并且找到了最短的满足条件的子串。
代码示例
def findSubstring(s: str, t: str) -> str:
    # 记录 t 中每个字符出现的次数
    t_freq = {}
    for c in t:
        t_freq[c] = t_freq.get(c, 0) + 1

    # 记录窗口中每个字符出现的次数
    window_freq = {}
    left, right = 0, 0  # 窗口的左右指针
    count = 0  # 记录窗口中已经包含了 t 中字符的数量
    min_len = float('inf')  # 记录当前最短的满足条件的子串的长度
    res = ''  # 记录当前最短的满足条件的子串

    while right < len(s):
        c1 = s[right]
        if c1 in t_freq:
            window_freq[c1] = window_freq.get(c1, 0) + 1
            if window_freq[c1] == t_freq[c1]:
                count += 1
        right += 1

        while count == len(t):
            if right - left < min_len:
                min_len = right - left
                res = s[left:right]

            c2 = s[left]
            if c2 in t_freq:
                window_freq[c2] -= 1
                if window_freq[c2] < t_freq[c2]:
                    count -= 1
            left += 1

    return res

以上就是关于 | |问题 12 题目的详细介绍和算法分析。