AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 438. 找到字符串中所有字母异位词    原题链接    中等

作者: 作者的头像   zhy0130 ,  2025-03-27 10:17:53 · 天津 ,  所有人可见 ,  阅读 2


1


题目描述

可以使用滑动窗口进行求解

复杂度

时间复杂度为 (O(n)) 空间复杂度为 (O(n))

Java 代码

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
         Map<Character, Integer> cnt = new HashMap<>();
        for (char c : p.toCharArray()) {
            cnt.put(c, cnt.getOrDefault(c, 0) + 1);
        }

        List<Integer> res = new ArrayList<>();
        int tot = cnt.size(); // 目标字符种类数
        int satisfy = 0; // 当前窗口中满足条件的字符种类数

        // 双指针滑动窗口
        for (int i = 0, j = 0; i < s.length(); i++) {
            // 将当前字符加入窗口,并更新频率
            char c = s.charAt(i);
            cnt.put(c, cnt.getOrDefault(c, 0) - 1);
            if (cnt.get(c) == 0) {
                satisfy++; // 如果某个字符频率达到目标值,满足种类数增加
            }

            // 当窗口大小超过 p 的长度时,收缩左边界
            while (i - j + 1 > p.length()) {
                char d = s.charAt(j);
                if (cnt.get(d) == 0) {
                    satisfy--; // 如果移出的字符频率不再满足,减少满足种类数
                }
                cnt.put(d, cnt.get(d) + 1); // 更新频率
                j++; // 移动左指针
            }

            // 如果满足种类数与目标种类数一致,记录左边界
            if (satisfy == tot) {
                res.add(j);
            }
        }

        return res;
    }
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息