LeetCode 算法:找到字符串中所有字母异位词c++

原题链接🔗:找到字符串中所有字母异位词
难度:中等⭐️⭐️

题目

给定两个字符串 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.length, p.length <= 3 * 104
s 和 p 仅包含小写字母

题解

滑动窗口法

  1. 题解
  • 理解异位词:两个字符串是异位词,意味着它们包含相同的字符,并且每个字符出现的次数也相同,但是字符的排列顺序可以不同。

  • 滑动窗口:使用滑动窗口的方法来遍历字符串 s,窗口的大小与字符串 p 的长度相等。

  • 字符计数:使用哈希表(unordered_map)来记录字符串 p 中每个字符的出现次数。

  • 窗口内字符匹配:在滑动窗口的过程中,使用另一个哈希表来记录当前窗口内的字符及其出现次数,并与 p 中的字符计数进行比较。

  • 更新窗口:每次向右移动窗口时,添加新的字符到窗口的哈希表中,并从窗口中移除一个字符。

  • 判断异位词:如果在某个时刻,当前窗口内的字符计数与 p 中的字符计数相匹配,则说明找到了一个异位词,记录此时窗口的起始索引。

  • 继续滑动:继续滑动窗口直到遍历完整个字符串 s。

  • 返回结果:返回所有找到的异位词子串的起始索引列表。

  1. 复杂度:时间复杂度 O(n * m),空间复杂度 O(m)。
  2. 代码过程
  • 初始化一个哈希表 pCount 来存储 p 中字符的出现次数。

  • 初始化两个指针 left 和 right,分别指向当前考虑的窗口的起始和结束位置。

  • 使用一个哈希表 windowCount 来存储当前窗口内的字符计数。

  • 扩展窗口,直到窗口的大小等于 p 的长度。

  • 当窗口大小等于 p 的长度时,检查当前窗口是否是 p 的异位词:

    • 如果是,记录下 left 指针的位置,因为这是子串的起始索引。
    • 移动 right 指针来扩展窗口,并更新 windowCount。
  • 移动left 指针来收缩窗口,并更新 windowCount。

  • 重复步骤 5 和 6,直到 right 指针遍历完整个字符串 s。

  • 返回记录的所有起始索引。

  1. c++ demo
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>class Solution {
public:std::vector<int> findAnagrams(const std::string& s, const std::string& p) {std::vector<int> result;if (s.size() < p.size()) return result; // 如果s的长度小于p的长度,不可能有异位词// 用于存储p中字符的频率std::unordered_map<char, int> pFreq;for (char c : p) {pFreq[c]++;}// 用于存储当前窗口的字符频率std::unordered_map<char, int> windowFreq;int left = 0, right = 0; // 左右指针,定义当前窗口int validChars = 0; // 当前窗口中与p中字符匹配的字符数量// 窗口大小小于p时,继续扩展窗口while (right < s.size() && right - left < p.size()) {char c = s[right];if (pFreq.find(c) != pFreq.end()) {windowFreq[c]++;}right++;}// 当窗口大小等于p时,开始检查是否为异位词while (right - left == p.size()) {// 如果当前窗口是p的异位词,记录起始索引if (isAnagram(pFreq, windowFreq)) {result.push_back(left);}// 移动窗口char leftChar = s[left];if (pFreq.find(leftChar) != pFreq.end()) {if (windowFreq[leftChar] == pFreq[leftChar]) {validChars--;}windowFreq[leftChar]--;if (windowFreq[leftChar] < pFreq[leftChar]) {validChars++;}}left++;// 扩展窗口if (right < s.size()) {char rightChar = s[right];if (pFreq.find(rightChar) != pFreq.end()) {windowFreq[rightChar]++;if (windowFreq[rightChar] == pFreq[rightChar]) {validChars--;}}right++;}}return result;}private:// 辅助函数,用于比较两个字符计数映射是否相等bool isAnagram(const std::unordered_map<char, int>& pFreq,const std::unordered_map<char, int>& windowFreq) {for (const auto& kv : pFreq) {if (kv.second != windowFreq.at(kv.first)) {return false;}}return true;}
};int main() {Solution solution;std::string s = "cbaebabacd";std::string p = "abc";std::vector<int> anagramIndices = solution.findAnagrams(s, p);std::cout << "Start indices of anagrams of \"" << p << "\" in \"" << s << "\" are:" << std::endl;for (int index : anagramIndices) {std::cout << index << std::endl;}return 0;
}
  • 输出结果:

Start indices of anagrams of “abc” in “cbaebabacd” are:
0
6
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/338911.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx实战:防盗链

防盗链的概念 内容不在自己的服务器上&#xff0c;通过技术手段将其他网站的内容&#xff08;比如 一些音乐、图片、软件的下载地址&#xff09;放置在自己的网站中&#xff0c;通过这 种方法盗取其他网站的空间和流量 防盗链技术背景 防止第三方引用链接访问我们的图片&#x…

mysql面试之分库分表总结

文章目录 1.为什么要分库分表2.分库分表有哪些中间件&#xff0c;不同的中间件都有什么优点和缺点&#xff1f;3.分库分表的方式(水平分库,垂直分库,水平分表,垂直分表)3.1 水平分库3.2 垂直分库3.3 水平分表3.4 垂直分表 4.分库分表带来的问题4.1 事务一致性问题4.2 跨节点关联…

UE_地编教程_创建地形洞材质

个人学习笔记&#xff0c;不喜勿喷。侵权立删&#xff01; 使用地形洞材质来遮罩地形上特定位置的可视性和碰撞。如要在山脉侧面创建进入洞穴的入口&#xff0c;此操作将非常有用。可使用地形材质和地形洞材质的相同材质&#xff0c;但注意&#xff1a;对比不使用不透明蒙版的…

【Linux】Linux工具——yum,vim

1.Linux 软件包管理器——yum Linux安装软件&#xff1a; 源代码安装&#xff08;不建议&#xff09;rpm安装&#xff08;类似Linux安装包&#xff0c;版本可能不兼容&#xff0c;不推荐&#xff0c;容易报错&#xff09;yum安装&#xff08;解决了安装源&#xff0c;安装版本&…

即时通讯平台及门户系统WorkPlus打造移动应用管理平台

在全球化和数字化时代&#xff0c;企业管理和沟通的方式正发生着巨大的变化。为了实现高效的协作和资源共享&#xff0c;企业越来越倾向于使用即时通讯及门户系统。这两种系统结合起来&#xff0c;可以提供一套完整的沟通和信息发布平台&#xff0c;促进内部协作和信息管理。 …

【Python内功心法】:深挖内置函数,释放语言潜能

文章目录 &#x1f680;一、常见内置函数&#x1f308;二、高级内置函数⭐1. enumerate函数&#x1f44a;2. eval函数❤️3. exec函数&#x1f4a5;4. eval与exec 中 globals与locals如何用☔4-1 globals 参数&#x1f3ac;4-2 locals 参数 ❤️5. filter函数&#x1f44a;6. z…

【Leetcode笔记】40.组合总和II

1. 题目要求 这道题目和39.组合总和不一样的地方在于&#xff1a;数组中含有相同的元素。同样地&#xff0c;结果不能含有重复组合。 拿第一个示例来看&#xff0c; candidates [1, 1, 2, 5, 6, 7, 10]问题在于&#xff1a;第一个path[1(index 0), 2]&#xff0c;绝不能出现…

0、机器学习知识点

机器学习知识点 知识点汇总 知识点汇总 https://blog.csdn.net/seagal890/article/details/105352987 https://blog.csdn.net/fengdu78/article/details/115878843

[数据集][目标检测]脑溢血检测数据集VOC+YOLO格式767张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;767 标注数量(xml文件个数)&#xff1a;767 标注数量(txt文件个数)&#xff1a;767 标注类别…

unity2D跑酷游戏

项目成果 项目网盘 导入资源包 放入Assets文件Assets资源文件 游戏流程分析 摄像机size调小&#xff0c;让图片占满屏幕 人跑本质&#xff0c;相对运动&#xff0c;图片无限向右滚动 图片720&#xff0c;缩小100倍第二个图片x为7.2每unit px100两张图片刚好挨着连贯 空对象Bg…

友善RK3399v2平台利用rkmpp实现硬件编解码加速

测试VPU 编译mpp sudo apt update sudo apt install gcc g cmake make cd ~ git clone https://github.com/rockchip-linux/mpp.git cd mpp/build/linux/aarch64/ sed -i s/aarch64-linux-gnu-gcc/gcc/g ./arm.linux.cross.cmake sed -i s/aarch64-linux-gnu-g/g/g ./arm.lin…

Python 入门教程详细版全集(两周速成)

一、初始Python 打开CMD&#xff08;命令提示符&#xff09;程序&#xff0c;输入Python并回车。然后&#xff0c;在里面输入代码回车即可立即执行。 Tip1:找不到“命令提示符”程序在哪里&#xff1f; 使用快捷键&#xff1a;win r;打开运行框&#xff0c;输入cmd后回车即可…

942. 增减字符串匹配 - 力扣

1. 题目 由范围 [0,n] 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s &#xff0c;其中: 如果 perm[i] < perm[i 1] &#xff0c;那么 s[i] I 如果 perm[i] > perm[i 1] &#xff0c;那么 s[i] D 给定一个字符串 s &#xff0c;重构排列 pe…

【LeetCode算法】第111题:二叉树的最小深度

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树的先序遍历。求出左子树的最小高度&#xff0c;求出右子树的最小高度&#xff0c;最终返回左子树和右子树的最小高度1。关键&#xff1a;若左子树的高度为0&…

springboot发送短信验证码,结合redis 实现限制,验证码有效期2分钟,有效期内禁止再次发送,一天内发送超3次限制

springboot结合redis发送短信验证码,实现限制发送操作 前言(可忽略)实现思路正题效果图示例手机号不符合规则校验图成功发送验证码示例图redis中缓存随机数字验证码&#xff0c;2分钟后失效删除redis缓存图验证码有效期内 返回禁止重复发送图验证码24小时内发送达到3次&#xf…

[深度学习]使用python部署yolov10的onnx模型

测试环境&#xff1a; onnxruntime1.15.1 opencv-python4.8.0.76 部分实现代码&#xff1a; parser argparse.ArgumentParser()parser.add_argument("--model", typestr, default"yolov10n.onnx", help"Input your ONNX model.")parser.add_arg…

ChatGPT AI专题资料合集【65GB】

介绍 ChatGPT & AI专题资料合集【65GB】 &#x1f381;【七七云享】资源仓库&#xff0c;海量资源&#xff0c;无偿分享√

网络监听技术

网络监听技术 网络监听概述网络监听环境 流量劫持网络环境共享式网络监听原理交换式网络监听交换机的工作方式交换网络监听&#xff1a;交换机集线器交换网络监听&#xff1a;端口镜像交换网络监听&#xff1a;MAC洪泛交换网络监听&#xff1a;MAC洪泛交换网络监听&#xff1a;…

7-15 位模式(dump_bits)---PTA实验C++

一、题目描述 为方便调试位运算相关程序&#xff0c;先做个展现位模式的小工具。 建议参照以下接口实现&#xff1a; // 利用函数重载特性&#xff1a;string dump_bits(char x);string dump_bits(short x);string dump_bits(int x);string dump_bits(long long x);// 或用函…

Windows10系统中安装与配置PyTorch(无GPU版本)

文章目录 1. 什么是PyTorch2. PyTorch的安装与配置&#xff08;无GPU&#xff09;2.1 创建环境2.2 安装pytorch库&#xff08;无GPU&#xff09;2.3 验证安装结果 1. 什么是PyTorch PyTorch 是一种用于构建深度学习模型且功能完备的开源框架&#xff0c;通常用于处理图像识别和…