【力扣】438.找到字符串中所有字母异位词

news/2025/2/3 20:36:04 标签: leetcode, 算法, 职场和发展

AC截图

题目

思路

我一开始是打算将窗口内的s子字符串和p字符串都重新排序,然后判断是否相等,再之后进行窗口滑动。不过缺点是会超时。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> vec;

        if(s.size()<p.size()){
            return vec;
        }


        int len=p.size();
        sort(p.begin(),p.end());

        for(int i=0;i<=s.size()-len;i++){
            string ss = s.substr(i,len);
            sort(ss.begin(),ss.end());
            if(p==ss){
                vec.push_back(i);
            }
        }
        return vec;
    }
};

后面改用滑动窗口,

因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。

关键部分在此:

    //开始让窗口进行滑动
    for(int i=0;i<sLen-pLen;i++){ //i是滑动前的首位
        --scount[s.charAt(i) -'a'];       //将滑动前首位的词频删去
        ++scount[s.charAt(i+pLen) -'a'];  //增加滑动后最后一位的词频(以此达到滑动的效果)

        //判断滑动后处,是否有异位词
        if(scount==pcount){
            vec.push_back(i+1);
        } 
    }

代码

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> vec;

        if(s.size()<p.size()){
            return vec;
        }


        int plen=p.size();
        int slen=s.size();
        
        vector<int> scount(26);
        vector<int> pcount(26);
        for(int i=0;i<plen;i++){
            pcount[p[i]-'a']++;
            scount[s[i]-'a']++;
        }
        if(scount==pcount){
            vec.push_back(0);
        }

        for(int i=0;i<slen-plen;i++){
            scount[s[i]-'a']--;
            scount[s[i+plen]-'a']++;

            if(scount==pcount){
                vec.push_back(i+1);
            }
        }

        return vec;
    }
};


http://www.niftyadmin.cn/n/5841052.html

相关文章

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.12 连续数组:为什么contiguous这么重要?

2.12 连续数组&#xff1a;为什么contiguous这么重要&#xff1f; 目录 #mermaid-svg-wxhozKbHdFIldAkj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wxhozKbHdFIldAkj .error-icon{fill:#552222;}#mermaid-svg-…

【C++语言】卡码网语言基础课系列----13. 链表的基础操作I

文章目录 背景知识链表1、虚拟头节点(dummyNode)2、定义链表节点3、链表的插入 练习题目链表的基础操作I具体代码实现 小白寄语诗词共勉 背景知识 链表 与数组不同&#xff0c;链表的元素存储可以是连续的&#xff0c;也可以是不连续的&#xff0c;每个数据除了存储本身的信息…

ESP32 Wroom (无串口芯片的简版C3) 烧录

烧录前按住boot, 然后按下reset&#xff08;EN&#xff09;, 松开手烧录完按下reset (EN), 才进入running状态

【漫话机器学习系列】074.异方差(Heteroscedasticity)

异方差&#xff08;Heteroscedasticity&#xff09; 异方差&#xff08;Heteroscedasticity&#xff09;是指在回归分析中&#xff0c;误差项的方差不恒定的现象。通常&#xff0c;我们假设回归模型中的误差项具有恒定方差&#xff08;即同方差性&#xff0c;homoscedasticity…

Windows编译FreeRDP步骤

1. **安装必要工具** powershell # 安装 Visual Studio 2022 (勾选"C桌面开发"组件) # 安装 CMake: https://cmake.org/download/ # 安装 Git: https://git-scm.com/ 2. **安装依赖项** powershell # 使用vcpkg包管理 git clone https://github.com/Microsoft/vcpk…

基于python的Kimi AI 聊天应用

因为这几天deepseek有点状况&#xff0c;导致apikey一直生成不了&#xff0c;用kimi练练手。这是一个基于 Moonshot AI 的 Kimi 接口开发的聊天应用程序&#xff0c;使用 Python Tkinter 构建图形界面。 项目结构 项目由三个主要Python文件组成&#xff1a; 1. main_kimi.py…

K个不同子数组的数目--滑动窗口--字节--亚马逊

Stay hungry, stay foolish 题目描述 给定一个正整数数组 nums和一个整数 k&#xff0c;返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 k&#xff0c;则称 nums 的这个连续、不一定不同的子数组为 「好子数组 」。 例如&#xff0c;[1,2,…

机试题——找磨损度最高和最低的硬盘

题目描述 存储阵列上使用的一批固态硬盘&#xff0c;根据硬盘磨损值给定一个数组 endurances&#xff0c;数组中每个元素表示单块硬盘的磨损度&#xff08;0 到 10000 之间&#xff09;。磨损度越大&#xff0c;表示此盘需要更换的概率越高。需要找出磨损度最高三块盘的下标和…