LeetCode Hot100_438.找到字符串中所有字母异位词
滑动窗口:
import java.util.*;
class Solution {
public List<Integer> findAnagrams(String s, String p) {
// 使用HashMap来存储目标字符串p的字符及出现次数
Map<Character, Integer> need = new HashMap<>();
// 使用HashMap来存储当前窗口中的字符及出现次数
Map<Character, Integer> window = new HashMap<>();
// 初始化need地图
for (char c : p.toCharArray()) {
need.put(c, need.getOrDefault(c, 0) + 1);
}
int left = 0, right = 0;
int valid = 0; // 用于记录窗口中满足need条件的字符数目
List<Integer> res = new ArrayList<>(); // 记录结果
while (right < s.length()) {
char c = s.charAt(right); // 获取右指针指向的字符
right++;
// 如果当前字符是需要的字符,则更新窗口和valid变量
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
// 当窗口中的字符数量和need中的字符数量一致时,valid增加
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
// 当窗口大小超过或等于p的长度时,尝试收缩窗口
while (right - left >= p.length()) {
// 如果valid等于need的大小,说明找到了一个字母异位词
if (valid == need.size()) {
res.add(left);
}
char d = s.charAt(left); // 获取左指针指向的字符
left++;
// 如果当前字符是需要的字符,则更新窗口和valid变量
if (need.containsKey(d)) {
// 如果当前字符对应的数量和need中的数量一致,则valid减少
if (window.get(d).equals(need.get(d))) {
valid--;
}
window.put(d, window.get(d) - 1);
}
}
}
return res;
}
}
移除左指针字符:
移除 left 指针指向的字符 d:
如果该字符是目标字符串 p 中的字符(need 地图中存在),则需要更新 window 地图和 valid 变量。
如果 window[d] 的数量等于 need[d],则 valid 需要减少 1。
更新 window[d] 的数量为 window[d] - 1。

浙公网安备 33010602011771号