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

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

题目: 给定两个字符串 s 和 p,找到 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

相关推荐
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 喜欢与取消喜欢
java·开发语言·交友
Ivanqhz6 小时前
MoE 原理、TC/EC 路由、LSH-MoE 与负载均衡浅析
运维·网络·人工智能·深度学习·算法·机器学习·负载均衡
Sarvartha6 小时前
栈的四则运算、栈的递归应用
数据结构·算法
stolentime6 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
杨逢昌工厂6S管理6 小时前
126-杨逢昌6S三环体系:越做越乱的现场熵增机理与基准化治理——一线现场诊断笔记
经验分享·笔记·职场和发展·学习方法
逐光者9336 小时前
杨氏模量:从定义到工程应用
算法
quantdash_cc6 小时前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
衍生星球6 小时前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
CodeGL7 小时前
16、Python Web开发
开发语言·前端·python
喵了几个咪7 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind