滑动窗口 | 最小覆盖子串


class Solution {
    public String minWindow(String s, String t) {
		if (t.length() > s.length()) {
			return "";
		}

		Map<Character, Integer> need = new HashMap<>();
		for (int i = 0; i < t.length(); i++) {
			need.put(t.charAt(i), need.getOrDefault(t.charAt(i), 0) + 1);
		}

		Map<Character, Integer> window = new HashMap<>();
		int valid = 0;
		int l = 0, r = 0;
		int min_LEN = Integer.MAX_VALUE, min_LEFT = 0;
        
		while (r < s.length()) {
			// 扩大右边界
			char ch = s.charAt(r);
			r++;
			window.put(ch, window.getOrDefault(ch, 0) + 1);
			if (window.get(ch).equals(need.get(ch))) {
				valid++;
			}

			// 满足条件时缩小窗口
			while (valid == need.size()) {
				// 记录当前窗口
				if (r - l < min_LEN) {
					min_LEN = r - l;
					min_LEFT = l;
				}

				// 缩小左边界
				char c = s.charAt(l);
				if (window.get(c).equals(need.get(c))) {
					valid--;
				}
				window.put(c, window.get(c) - 1);
				l++;
			}
		}
		return min_LEN == Integer.MAX_VALUE ? "" : s.substring(min_LEFT, min_LEFT + min_LEN);
    }
}


全部评论

相关推荐

2025-12-13 14:51
已编辑
井冈山大学 算法工程师
龙虾x:算法比你强的没有你美,比你美的…..算了已经没有比你美的了
工作两年想退休了
点赞 评论 收藏
分享
2025-12-15 14:16
门头沟学院 Java
回家当保安:发offer的时候会背调学信网,最好不要这样。 “27届 ”和“28届以下 ”公司招聘的预期是不一样的。
实习简历求拷打
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务