LeetCode438. 找到字符串中所有字母异位词(2024秋季每日一题 11)

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

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"

输出: 0,6

解释:

起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。

起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"

输出: 0,1,2

解释:

起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。

起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。

起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

1 < = s . l e n g t h , p . l e n g t h < = 3 ∗ 1 0 4 1 <= s.length, p.length <= 3 * 10^4 1<=s.length,p.length<=3∗104
s 和 p 仅包含小写字母


思路:

  • 维护两个 cnt 数组,pcnt、scnt,pcntx 表示字母 x 出现的次数,x= 'a'\~'z'
  • 扫描 s 字符串,对每一个长度为 p.size() 的子串,维护一个 scnt 数组
  • 当子串的 scnt 每个位置(即每个字母)的数量等于 pcnt 时,则代表 当前子串与 p 串是异位词
  • 而对于 c++ 中的 vector,可以直接进行比较,相当于比较数组内对应下标每个元素的大小
  • 而当对 s 从前往后扫描长度为 p.size() 的子串的时候,可以维护一个滑动窗口
    • 当子串按顺序往后扫描一个时,就相当于窗口向后挪了一个位置,对于子串的改变,相当于在子串中加了一个字母 si,而去掉了一个字母 si-p.size(),而对当前子串中所有字母数量的的改变也只有 scnts\[i] 和 scnti-p.size()

时间复杂度:O(N*M),M = 26;

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> res;
        vector<int> pcnt(30, 0), scnt(30, 0);
        for(int i = 0; i < p.size(); i++){
            pcnt[p[i] - 'a']++;
            if(i < s.size()) scnt[s[i] - 'a']++;
        }
        if(pcnt == scnt) res.push_back(0);
        for(int i = p.size(); i < s.size(); i++){
            scnt[s[i] - 'a']++, scnt[s[i - p.size()]-'a']--;
            if(pcnt == scnt) res.push_back(i - p.size() + 1);
        }
        return res;
    }
};
相关推荐
mmmmath_38 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
专注仿真8 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸8 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫8 小时前
2028编程圈很火的10个Skills
算法·面试·github
Nil20813 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing13 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_313 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
loulanyue_14 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院14 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
suhan15 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法