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

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

题目:

给定两个字符串 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" 的异位词。

分析:

借鉴了力扣49题的思路,拼接p中字符和字符出现次数来作为判断异位词的条件。从头开始遍历,计算s字符串中当前下标以及当前下标+p.length()-1之间字符的出现次数,进行拼接,与p的拼接结果进行比较,相同则保存当前下标。

这种方法虽然能通过但是太慢,每次都要拼接,都要进行一个26次的循环。

改进:

49题进行拼接是因为要在一堆字符串中找出其中的异位词组,所以要用拼接的结果作为unordered_map的键值,去和异位词做映射,保存拼接结果与键值相同的异位词。这题并不不需要,题目已经给出要找的字符串,所以直接比较字符出现次数就行。

采用滑动窗口,由于已经给出要查找的字符串,那么滑动窗口的大小就确定,是p的长度。在s和p中,都先从头开始,计算窗口大小字符串中字符的出现次数,保存在数组(scount,pcount)中(字符与下标映射)。然后s开始滑动:将窗口的首元素滑出,同时改变数组中该字符对应下标的元素的值(-1),然后将新字符加入滑动窗口,同理,改变scount数组中该字符对应下标的元素的值(+1)。滑动完一次,比较一次sount数组与pcount数组,相同则将窗口首元素在字符串中对应的下标保存。

代码:

class Solution {
    public:
        vector<int> findAnagrams(string s, string p) {
            vector<int>res;
            vector<int>scount(26);
            vector<int>pcount(26);
            for(int i=0;i<p.length();++i)
            {
                scount[s[i]-'a']++;
                pcount[p[i]-'a']++;
            }
            if(scount==pcount)
            {
                res.push_back(0);
            }
            for(int i=0;i<(s.length()-p.length());++i)
            {
                //移除滑动窗口队头,增加新元素
                --scount[s[i]-'a'];
                ++scount[s[i+p.length()]-'a'];
                if(scount==pcount)
            {
                res.push_back(i+1);
            }

            }
            return res;
        }
    };

相关文章:

  • osgearth视点坐标及鼠标交点坐标的信息显示(七)
  • 仿叮咚买菜鸿蒙原生APP
  • rabbitmq五种模式的实现——springboot
  • 线性代数中的正交和标准正交向量
  • 数据结构:顺序表
  • flutter 专题四十八 Google发布Flutter 2.0正式版,支持全平台程序构建
  • 如何在不依赖函数调用功能的情况下结合工具与大型语言模型
  • ranges::set_intersection set_union set_difference set_symmetric_difference
  • ollama本地部署 deepseek离线模型安装 一套从安装到UI运行
  • 【系列专栏】银行IT的云原生架构-存储架构-数据库部署 10
  • python+halcon 解读labelme标注生成marksimage
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十九节】
  • Jetpack Compose系列教程之(10)——State及remeber
  • MySQL的SQL执行流程
  • 机器学习(四)
  • 智能车摄像头开源—8 元素处理
  • 【FastAPI】8.FastAPI结合Jinja2模板完成一个待办列表
  • 【数据结构-并查集】力扣721. 账户合并
  • Pycharm 2024在解释器提供的python控制台中运行py文件
  • DDD该怎么去落地实现(3)通用的仓库和工厂
  • 兴业银行一季度净赚超237亿降逾2%,营收降逾3%
  • 东风着陆场近日气象条件满足神舟十九号安全返回要求
  • 上海“模速空间”:将形成人工智能“北斗七星”和群星态势
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查
  • 新疆维吾尔自治区原质量技术监督局局长刘新胜接受审查调查
  • 看展览|建造上海:1949年以来的建筑、城市与文化