LeetCode Hot100_438.找到字符串中所有字母异位词

题目链接:
https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked

滑动窗口:

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。

posted @ 2025-02-14 09:24  烟雨化飞龙  阅读(33)  评论(0)    收藏  举报