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

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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务