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

2024-05-11 13:52

本文主要是介绍【算法】滑动窗口——找到字符串中所有字母异位词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

目录

  • 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.chinasem.cn/article/979723

相关文章

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

2390.从字符串中移除星号

给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号左侧最近的那个非星号字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题面中描述的操作。 可以证明结果字符串是唯一的。 示例 1: 输入:s = “leet**cod*e” 输出:“lecoe” 解释:从左到右执行移除操作: 距离第 1 个

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以