当前位置: 首页 > news >正文

力扣刷题HOT100——438.找到字符串中所有字母异位词

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

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

思路:

滑动窗口。

  1. 界条件检查:在函数开始时,检查 s 的长度是否小于 p 的长度,若小于则直接返回空结果。
  2. 字符计数统计:分别统计字符串 p 中每个字符的出现次数到 pmp 中,以及初始窗口内字符的出现次数到 smp 中。
  3. 检查初始窗口:比较 smp 和 pmp,若相等则将起始索引 0 添加到结果中。
  4. 移动滑动窗口i 从 plen 开始,每次移动窗口时,移除窗口最左边的字符,添加窗口最右边的字符,并更新 smp。若更新后的 smp 和 pmp 相等,则将当前窗口的起始索引添加到结果中。
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
       vector<int> res;
       int slen=s.size();
       int plen=p.size();
       unordered_map<char,int> pmp;
       for(char x:p)
       {
        pmp[x]++;
       }
       unordered_map<char,int> smp;
        // 初始化滑动窗口
    for (int i = 0; i < plen; i++) {
        smp[s[i]]++;
    }

    // 检查初始窗口是否是 p 的字母异位词
    if (smp == pmp) {
        res.push_back(0);
    }

       for(int i=plen;i<slen;i++)
       {
         smp[s[i - plen]]--;
        if (smp[s[i - plen]] == 0) {
            smp.erase(s[i - plen]);
        }
       smp[s[i]]++;
        if(smp==pmp)
        {
            res.push_back(i-plen+1);
        }
       
       }
       return res;
    }
};

复杂度分析

  • 时间复杂度:\(O(n)\),其中 n 是字符串 s 的长度。每个字符最多被访问两次。
  • 空间复杂度:\(O(k)\),其中 k 是字符集的大小,主要用于存储 pmp 和 smp

相关文章:

  • DAY 44 leetcode 28--字符串.实现strStr()
  • 【技术文章的标准结构与内容指南】
  • GIC驱动程序分析
  • 自注意力的机制内涵和设计逻辑
  • 151. 反转字符串中的单词
  • AJAX原理与XMLHttpRequest
  • 榕壹云酒水定制系统:基于THinKPHP+MySQL+UniApp打造数字化时代的个性化购酒新体验
  • EasyCVR视频汇聚系统:AIoT+视频智能分析赋能食品安全生产全流程监管
  • golang-非orm数据库的操作与对比 database/sql、sqlx 和 sqlc
  • 鸿蒙开发-模块化-导入,导出模块
  • 【信息系统项目管理师】高分论文:论信息系统项目的整合管理(银行数据仓库项目)
  • C#进阶学习(二)泛型及泛型约束的认识
  • day25 学习笔记
  • Python字符串split()函数完全指南
  • 【解决】bartender软件换网之后神秘变慢
  • 发票识别接口:企业财务数字化转型的 “超级引擎”
  • 大数据学习栈记——MongoDB安装
  • Build a Debugger (1) : ptrace
  • GO语言入门
  • 线程上下文切换耗时分析
  • 裁员15%、撤销132个机构,美国务院将全面重组
  • 全国人大常委会启动工会法执法检查
  • 深一度|坚守17年,这件事姚明就算赔钱也在继续做
  • 最高法报告点名“夜郎古酒”商标侵权案:促成当事人握手言和
  • 女子拿蘸料时触电受伤,海底捞回应
  • 京东:自21日起,所有超时20分钟以上的外卖订单全部免单