Leetcode 76 最小覆盖子串 java版
发布日期:2025-04-05 00:20:18 浏览次数:11 分类:精选文章

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

为了解决找出字符串 s 中涵盖字符串 t 所有字符的最小子串的问题,我们可以使用滑动窗口技术。该方法通过调整窗口的左右指针来找到最短的包含 t 所有字符的子串。

方法思路

  • 初始化窗口:使用滑动窗口的方法,首先由右指针逐渐扩展窗口,直到窗口包含 t 的所有字符。
  • 收缩窗口:一旦窗口包含所有必要字符,开始用左指针逐步收缩窗口,使其尽量小,同时仍然包含 t 的所有字符。
  • 记录最小窗口:在收缩过程中,记录每次满足条件的窗口的位置和长度,找到最小的一个。
  • 维护计数器:使用一个 HashMap 来记录当前窗口中每个字符的数量,确保窗口中每个字符的数量满足 t 中的最低要求。
  • 解决代码

    public class Solution {    public static String minWindow(String s, String t) {        Map
    charCountT = new HashMap<>(); Map
    window = new HashMap<>(); for (int i = 0; i < t.length(); i++) { char c = t.charAt(i); charCountT.put(c, charCountT.getOrDefault(c, 0) + 1); } int minStart = Integer.MAX_VALUE; int minEnd = Integer.MAX_VALUE; int left = 0; int right = 0; for (right = 0; right < s.length(); right++) { char c = s.charAt(right); if (window.containsKey(c)) { window.put(c, window.get(c) + 1); } else { window.put(c, 1); } while (true) { char current = s.charAt(left); if (window.get(current) < charCountT.getOrDefault(current, 0)) { break; } left++; } if (left > right) { break; } if (right - left + 1 < (minEnd - minStart + 1)) { minStart = left; minEnd = right; } char currentChar = s.charAt(left); window.put(currentChar, window.getOrDefault(currentChar, 0) + 1); left++; } if (minStart == Integer.MAX_VALUE) { return ""; } return s.substring(minStart, minEnd + 1); }}

    代码解释

  • 初始化计数器:对于 t 中的每个字符,记录其出现的次数。
  • 扩展窗口:从右指针开始,逐个字符加入窗口。对于每个字符,检查是否包含在 t 中,并更新计数器。
  • 收缩窗口:当窗口满足包含所有 t 的字符时,开始收缩左指针。一旦某个字符计数低于 t 中的要求,停止收缩。
  • 记录最小窗口:在每一次有效收缩后,记录当前窗口的位置和长度,如果比之前记录的小,则更新。
  • 返回结果:如果找到了满足条件的窗口,返回对应的子串;否则返回空字符串。
  • 通过这种方法,我们可以高效地找到符合条件的最小子串,确保时间复杂度为 O(n),其中 n 是 s 的长度。

    上一篇:leetcode 859. Buddy Strings
    下一篇:Leetcode 745. Prefix and Suffix Search

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月22日 03时39分15秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章