LeetCode题解:套用模板解决 滑动窗口 问题
发布日期:2021-04-30 21:01:32 浏览次数:115 分类:精选文章

本文共 1822 字,大约阅读时间需要 6 分钟。

要解决这个问题,我们可以使用滑动窗口算法来找到字符串 s 中包含字符串 t 所有字符的最小子串。以下是详细的解决方案:

方法思路

我们可以使用滑动窗口技术来解决这个问题。滑动窗口的基本思想是用两个指针来控制窗口的大小,右指针向右扩展窗口,左指针向左收缩窗口。当窗口中的字符频率与 t 中的字符频率匹配时,窗口中的字符就是 t 的一个排列。

具体步骤如下:

  • 初始化两个哈希表,一个记录 t 中字符的频率,另一个记录当前窗口中的字符频率。
  • 移动右指针,逐个字符加入窗口,更新当前窗口的频率表。
  • 检查当前窗口的频率是否与 t 的频率匹配,如果匹配,记录窗口的起始和结束位置。
  • 如果匹配,进入收缩窗口的循环,移动左指针,更新频率表,并记录最小的子串长度。
  • 继续移动右指针,直到满足条件为止。
  • 解决代码

    #include 
    #include
    using namespace std;class Solution {public: string minWindow(String s, String t) { HashMap
    need, window; for (char c : t.toCharArray()) { need[c] = need.getOrDefault(c, 0) + 1; } int left = 0, right = 0; int valid = 0; int start = 0, len = INT_MAX; while (right < s.length()) { char c = s.charAt(right); right++; if (need.containsKey(c)) { window[c] = window.getOrDefault(c, 0) + 1; if (window[c] == need[c]) { valid++; } } while (valid == need.size()) { if (right - left < len) { start = left; len = right - left; } char c1 = s.charAt(left); left++; if (need.containsKey(c1)) { if (window.get(c1) == need.get(c1)) { valid--; } window[c1]--; } } } return len == INT_MAX ? "" : s.substring(start, start + len); }};

    代码解释

  • 初始化哈希表need 表示 t 中每个字符的频率,window 表示当前窗口中每个字符的频率。
  • 滑动窗口指针leftright 指针控制窗口的左右边界。
  • 扩展窗口:移动 right 指针,逐个字符加入窗口,并更新 window 表。
  • 检查频率匹配:当窗口中的字符频率与 t 的匹配时,进入收缩窗口的循环。
  • 收缩窗口:移动 left 指针,更新频率表,并记录最小的子串长度。
  • 返回结果:当循环结束后,返回找到的最小子串,若未找到则返回空字符串。
  • 这个方法的时间复杂度是 O(n),其中 n 是字符串 s 的长度,空间复杂度是 O(n) 用于存储哈希表。

    上一篇:zkui windows版 zookeeper UI监控
    下一篇:对象流

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2026年05月23日 20时00分41秒