【算法】滑动窗口——找到字符串中所有字母异位词

本节博客是对题目——找到字符串中所有字母异位词的从读题到代码实现以及优化的详细解读,有需要借鉴即可。

目录

  • 1.题目
  • 2.滑动窗口 + 哈希数组
  • 3.异位词优化
  • 4.总结

1.题目

题目链接:LINK
在这里插入图片描述

首先来解释一下什么是异位词,所谓“异位词”,即不要求字母顺序的字符串。

其实这个题目思路很快就可以想到,拿个left,right指针,使两者间距始终等于p字符串长度,再与p字符串对比一下就行了。

说起来这个思路那不就是“滑动窗口”嘛,因为两个指针都是从左到右移动的。
那异位怎么进行比较的呢?可以搞一个哈希数组进行依次比较即可。

2.滑动窗口 + 哈希数组

于是,我们可以写出下面的代码:

class Solution
{
public:bool check(int* p, int*s){for(int i = 0;i < 128;i++){if(p[i] != s[i]){return false;}}return true;}vector<int> findAnagrams(string s, string p) {//统计一下p字符串的字符信息size_t len = p.size();int hash_p[128] = {0};for(int i = 0;i<len;i++){hash_p[p[i]]++;}int n = s.size();int hash_s[128] = {0};vector<int> ret;//滑动窗口for(int right = 0,left = 0;right < n;right++){//进窗口hash_s[s[right]]++;//判断,出窗口if(right - left + 1 > len){hash_s[s[left]]--;left++;}//更新结果if(check(hash_p,hash_s) && right - left + 1 == len){ret.push_back(left);}}return ret;}
};

实际上,题目中明确说只有小写字母,所以说可以把哈希数组搞成26个的:


class Solution
{
public:bool check(int* p, int* s){for (int i = 0; i < 26; i++){if (p[i] != s[i]){return false;}}return true;}vector<int> findAnagrams(string s, string p){//统计一下p字符串的字符信息size_t len = p.size();int hash_p[26] = { 0 };for (int i = 0; i < len; i++){hash_p[p[i] - 'a']++;}int n = s.size();int hash_s[26] = { 0 };vector<int> ret;//滑动窗口for (int right = 0, left = 0; right < n; right++)//"cbaebabacd"{//进窗口hash_s[s[right] - 'a']++;//判断,出窗口if (right - left + 1 > len){hash_s[s[left] - 'a']--;left++;}//更新结果if (check(hash_p, hash_s) && right - left + 1 == len){ret.push_back(left);}}return ret;}
};

3.异位词优化

虽然这样可以解题,不过问题是如果是比较的是比较多的字符呢?不仅仅是26的小写字母。我想如果这样比较,复杂度瞬间就会上来了。

所以,在比较异位词时,我们需要再优化一下:
思路大致是下面这样的,如下:
在这里插入图片描述
所以,可以优化为下面代码:


class Solution
{
public:vector<int> findAnagrams(string s, string p){//统计一下p字符串的字符信息size_t len = p.size();int hash_p[26] = { 0 };for (int i = 0; i < len; i++){hash_p[p[i] - 'a']++;}int n = s.size();int count = 0;//count标识有效字符的个数,即p字符串的长度int hash_s[26] = { 0 };vector<int> ret;//滑动窗口for (int right = 0, left = 0; right < n; right++)//"cbaebabacd"{//进窗口hash_s[s[right] - 'a']++;if(hash_s[s[right]-'a'] <= hash_p[s[right]-'a'])count++;//进窗口,维护有效字符个数//判断,出窗口if (right - left + 1 > len){if(hash_s[s[left] - 'a'] <= hash_p[s[left] - 'a'])count--;//出窗口,维护有效字符个数hash_s[s[left] - 'a']--;left++;}//更新结果if (count == len){ret.push_back(left);}}return ret;}
};

4.总结

其实总结一下来看,这个题目除了异位词问题之外也没什么东西,这个题目是一个典型的“固定长度的滑动窗口”,要解出来难度不大。


EOF

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

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

相关文章

show profile

功能 当你执行一个复杂的 SQL 查询时&#xff0c;这个命令可以帮助你了解查询的各个部分花费了多少时间&#xff0c;从而找到可能的性能瓶颈。默认情况下&#xff0c;参数处于关闭状态&#xff0c;并保存最近15次的运行结果 开启 查看是否支持 SHOW VARIABLES LIKE profili…

【XR806开发板试用】试用SWD+Jlink调试

XR806开发板&#xff0c;只能使用编写代码&#xff0c;然后通过UART下载&#xff0c;没法在线debug&#xff0c; 效率会差很多&#xff0c;官方没有提供这一方面的资料。 先查CPU&#xff0c; 官方介绍是arm-china的MC1&#xff0c;通过armv8 Architecture refenence manual资料…

Java SpringBoot 动态数据源

1. 原理 动态数据源&#xff0c;本质上是把多个数据源存储在一个 Map 中&#xff0c;当需要使用某一个数据源时&#xff0c;使用 key 获取指定数据源进行处理。而在 Spring 中已提供了抽象类 AbstractRoutingDataSource 来实现此功能&#xff0c;继承 AbstractRoutingDataSour…

跨境电商行业蓬勃发展,武汉星起航引领卖家孵化新潮流

近年来&#xff0c;我国跨境电商行业在政府的大力扶持下呈现出强劲的发展势头。随着国内制造业结构的加速调整与居民消费需求升级态势的持续凸显&#xff0c;跨境出口规模占比稳步提升&#xff0c;跨境进口规模同样不断扩大&#xff0c;行业市场规模持续增长。在这一背景下&…

系列介绍:《创意代码:Processing艺术编程之旅》

系列介绍&#xff1a;《创意代码&#xff1a;Processing艺术编程之旅》 标题创意&#xff1a; “代码绘梦&#xff1a;Processing艺术编程入门”“数字画布&#xff1a;用Processing创造视觉奇迹”“编程美学&#xff1a;Processing艺术创作指南”“创意编程&#xff1a;Proc…

nginx开启目录索引搭建文件服务器

目录索引 ngx_http_autoindex_module 模块可以支持目录列表浏览&#xff0c;开启方式 location / {autoindex on; }开启后就可以通过浏览器访问目录下的文件列表并且可以下载&#xff0c;像很多镜像资源站一样。可以文件浏览下载。这时候如果对某个目录不是所有用户可以访问下…

QT学习(4)——自定义控件

目录 引出自定义一个控件自定义控件定义方法函数widget窗口调用函数 总结 引出 QT学习&#xff08;4&#xff09;——自定义控件 自定义一个控件 自定义控件定义方法函数 #include "smallwid.h" #include "ui_smallwid.h"SmallWid::SmallWid(QWidget *par…

redis抖动问题导致延迟或者断开的处理方案

目录&#xff1a; 1、使用背景2、redis重试机制3、redis重连机制4、其他一些解决redis抖动问题方案 1、使用背景 客户反馈文件偶现打不开&#xff0c;报错现象是session not exist&#xff0c;最终定位是redis抖动导致的延迟/断开的现象&#xff0c;最终研发团方案是加入redis…

C# 集合(三) —— Stack/BitArray类

总目录 C# 语法总目录 集合三 Stack/BitArray 1. Stack2. BitArray 1. Stack 栈&#xff0c;先进后出 Stack<string> strArr new Stack<string>(); strArr.Push("tom"); strArr.Push("jerry"); strArr.Push("lily"); Console.Wri…

Mapreduce | 案例

根据提供的数据文件【test.log】 数据文件格式&#xff1a;姓名,语文成绩,数学成绩,英语成绩 完成如下2个案例&#xff1a; &#xff08;1&#xff09;求每个学科的平均成绩 &#xff08;2&#xff09;将三门课程中任意一门不及格的学生过滤出来 &#xff08;1&#xff09;求每…

Navicat安装配置(注册码)连接MySQL

下载资源 博主给你打包好了安装包&#xff0c;在网盘里&#xff0c;防止你下载到钓鱼软件 快说谢谢博主&#xff08;然后心甘情愿的点个赞~&#x1f60a;&#xff09; navicatformysql.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 安装流程 ①下载好压缩包后并解压 ② …

【JavaEE精炼宝库】多线程1(认识线程 | 创建线程 | Thread 类)

目录 一、认识线程 1.1 线程的概念&#xff1a; 1.2 为什么需要线程&#xff1a; 1.3 面试题.谈谈进程和线程的区别&#xff1a; 1.4 Java的线程和操作系统线程的关系&#xff1a; 二、创建线程 2.1 创建线程的5种写法&#xff1a; 2.1.1 写法1.继承 Thread 类&#xf…

【redis】Redis五种常用数据类型和内部编码,以及对String字符串类型的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

827. 最大人工岛

827. 最大人工岛 题目链接&#xff1a;827. 最大人工岛 代码如下&#xff1a; class Solution { public:int largestIsland(vector<vector<int>>& grid) {unordered_map<int,int> gridNum;int ngrid.size(), m grid[0].size();bool isAllGridtrue;//…

C++ | Leetcode C++题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slo…

【doghead】mac与wsl2联通

mbp 设置为发送端,那么要能与windows上 wsl2的ubutnu通信。 mbp的 uv 构建ok zhangbin@zhangbin-mbp-2  ~/tet/Fargo/zhb-bifrost/Bifrost-202403/worker/third_party/libuv   main clion使用lldb cmake构建 更新git2.45.0啊

【八股系列】Loader和Plugin的区别是什么?

Loader 是一个转换器&#xff0c;它将源代码从一种格式转换成另一种格式。例如&#xff0c;你可以使用 Loader 将 TypeScript 代码转换成 JavaScript 代码。Loader 通常在 module.rules 配置中指定。 常用的一些 Loader&#xff1a; babel-loader: 用于将 ES6 代码转换成 ES5 …

盘点自动驾驶的技术发展趋势

自动驾驶技术在不断发展变快&#xff0c;我们之前提过算法岗如今越来越卷&#xff0c;从今年的就业局势看&#xff0c;前年还属于蓝海行业的自动驾驶&#xff0c;今年就已经满满关上了招揽之门——呈红海之势。作为在这个行业中摸爬滚打的一以子&#xff0c;我们到底该如何纵观…

会员卡积分收银源码系统 支持多门店系统 带完整的安装代码包以及安装搭建教程

在数字化浪潮的推动下&#xff0c;传统零售行业面临着巨大的转型压力。为了满足现代消费者多样化的需求&#xff0c;提高门店管理效率和顾客满意度&#xff0c;小编给大家分享一款会员卡积分收银源码系统——支持多门店系统&#xff0c;并附带了完整的安装代码包以及安装搭建教…

君正T31移植电源IC—CW2015芯片简介

CW2015芯片简介 CW2015 是一款超紧凑、低成本、主机侧/电池组侧、无传感电阻器的电量计量系统 IC&#xff0c;适用于手持和便携式设备中的锂离子 (Li) 电池。CW2015 包括一个14 位Sigma-Delta ADC、一个精密电压基准和内置准确温度传感器。该 IC 允许最终用户消除占用大量电路板…