java滑动窗口 + 哈希表 解决最小覆盖子串问题
时间: 2025-06-28 12:09:30 浏览: 21
### 使用 Java 滑动窗口和哈希表实现最小覆盖子串
为了实现最小覆盖子串问题,可以采用滑动窗口技术配合哈希表来高效解决问题。具体来说:
- 创建两个 `HashMap` 来记录目标字符串 `t` 中各个字符的需求次数以及当前窗口内的字符频率。
- 初始化左右指针 `left` 和 `right`,并设定一个变量用于追踪有效字符的数量。
- 不断移动右指针扩展窗口直至满足条件;随后尝试收缩左侧边界以寻找更短的有效子串。
下面是完整的 Java 实现代码示例[^1]:
```java
import java.util.HashMap;
import java.util.Map;
public String minWindow(String s, String t) {
// 记录需要匹配的目标字符及其数量
Map<Character, Integer> need = new HashMap<>();
for (char c : t.toCharArray()) {
need.put(c, need.getOrDefault(c, 0) + 1);
}
// 当前窗口内的字符计数器
Map<Character, Integer> window = new HashMap<>();
int left = 0, right = 0;
int valid = 0; // 表示window中已经有多少个字符符合need的要求
// 记录最小覆盖子串的起始索引及长度
int start = 0, len = Integer.MAX_VALUE;
while (right < s.length()) {
char c = s.charAt(right);
right++;
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
// 判断左侧窗口是否要收缩
while (valid == need.size()) {
if ((right - left) < len) {
start = left;
len = right - left;
}
char d = s.charAt(left);
left++;
if (need.containsKey(d)) {
if (window.get(d).equals(need.get(d))) {
valid--;
}
window.put(d, window.get(d) - 1);
}
}
}
return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
}
```
此方法能够有效地找出源字符串 `s` 中包含所有目标字符串 `t` 字符的最短子串,并且时间复杂度接近线性级别 O(n)[^5]。
阅读全文
相关推荐




















