438. 找到字符串中所有字母异位词[中等]✅

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

题目: 给定两个字符串 sp,找到 s中所有 p异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

思路: 采用 滑动窗口 + 字符计数

核心思想:

异位词要求:窗口内每个字符出现次数和 p 完全相同

具体过程:

  • 统计字符串 p 中每个字符出现次数。

  • 使用长度为 p.length() 的窗口遍历 s

    • 右指针移动,新字符加入窗口。

    • 当窗口长度达到 p.length() 时:

      • 比较窗口中字符次数和 p 是否一致。

      • 如果一致,记录窗口左端点。

    • 窗口向右移动,移除左端字符。

时间复杂度: O(26n)

空间复杂度: O(1)

复制代码
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        // 统计 p 的每种字母的出现次数
        int[] cntP = new int[26];
        for (char c : p.toCharArray()) {
            cntP[c - 'a']++; // 统计 p 的字母
        }

        List<Integer> ans = new ArrayList<>();
        int[] cntS = new int[26]; // 统计 s 的长为 p.length() 的子串 t 的每种字母的出现次数
        for (int right = 0; right < s.length(); right++) {
            cntS[s.charAt(right) - 'a']++; // 右端点字母进入窗口
            int left = right - p.length() + 1;
            if (left < 0) { // 窗口长度不足 p.length()
                continue;
            }
            if (Arrays.equals(cntS, cntP)) { // t 和 p 的每种字母的出现次数都相同
                ans.add(left); // t 左端点下标加入答案
            }
            cntS[s.charAt(left) - 'a']--; // 左端点字母离开窗口
        }
        return ans;
    }
}

可参考思路讲解 史上最燃算法刷题!滑动窗口的逆袭!Leetcode 438. 找到字符串中所有字母异位词_哔哩哔哩_bilibili

相关推荐
土司大王1 小时前
LeetCode hot100——394.字符串解码:Java 双栈模拟
java·算法·leetcode
泡海椒1 小时前
jquick-pdf 超详细入门教程:Java 轻量级 HTML 模板生成 PDF 工具
java·开发语言
a187927218312 小时前
【算法】双指针与滑动窗口(三):相向双指针——比较、排除、收缩
算法·leetcode·双指针·滑动窗口·原理·相向双指针·算法讲解
八年。。2 小时前
WSL学习(三)——搭建Linux + C++ + SOME/IP 基础开发环境
开发语言·笔记·ubuntu
孙启超2 小时前
【AI开发之Rust】第 6 课:结构体、枚举与方法 —— 开始定义自己的类型
开发语言·人工智能·后端·ai·rust
电商API_180079052472 小时前
电商平台数据分析实战_帖子
开发语言·爬虫·python·数据采集·京东
AI 小老六2 小时前
Agent 记忆系统难在取舍
人工智能·算法·架构·agent·memory·harness
大熊背2 小时前
《Color constancy by characterization of illumination chromaticity》之色度色域最大化算法(一)
数码相机·算法·白平衡·色度色域
不会就选b2 小时前
算法日常・每日刷题--<贪心>13
算法
带多刺的玫瑰2 小时前
Leecode#35刷题之搜索插入位置
java·python·算法