【C++习题】15.滑动窗口_串联所有单词的子串

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

30. 串联所有单词的子串


题目描述:

dffa29ee592b14342154438e66e30da2


解法

滑动窗口+哈希表

这题和第14题不同的是:

  1. 哈希表不同:hash<string,int>
  2. leftright指针的移动不同:移动的步长是每个单词的长度
  3. 滑动窗口执行的次数不同

91a332542a4902ac57151f2aac381ad4


C++ 算法代码:

class Solution 
{public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;unordered_map<string, int> hash1; // hash1保存 words 里面所有单词的频次for(auto& s : words) hash1[s]++; //统计 word 出现的次数int len = words[0].size(), m = words.size(); //len 表示每个单词的长度,m 表示单词的总数for(int i = 0; i < len; i++) // 执行 len 次{unordered_map<string, int> hash2; // 维护窗口内单词的频次for(int left = i, right = i, count = 0; right + len <= s.size(); right += len){// 进窗口 + 维护 countstring in = s.substr(right, len);//从字符串 s 中提取一个长度为 len 的子串//s.substr(right, len) 这是一个字符串函数,用于从字符串 s 中提取子串。//right 是当前窗口的起始位置。//len 是每个单词的长度。hash2[in]++;//并将其存储在 hash2 中,用于统计当前滑动窗口内单词的出现次数/*hash1 是一个 unordered_map,用于存储 words 列表中每个单词的出现频次。hash1.count(in) 检查单词 in 是否存在于 hash1 中。如果 in 存在于 hash1 中,hash1.count(in) 返回 1(真)。如果 in 不存在于 hash1 中,hash1.count(in) 返回 0(假)。hash2[in] <= hash1[in]这部分代码检查当前单词 in 在 hash2 中的出现次数是否小于或等于它在 words 列表中的出现次数(即 hash1[in])。如果 hash2[in] 小于或等于 hash1[in],说明当前窗口内单词 in 的出现次数没有超过 words 列表中的限制。*/if(hash1.count(in) && hash2[in] <= hash1[in]) {count++;}// 判断if(right - left + 1 > len * m){// 出窗口 + 维护 countstring out = s.substr(left, len); //s.substr(left, len) ,这个子串 out 是当前窗口最左边的单词。/*hash1.count(out) 检查 out 是否存在于 hash1 中hash2[out] <= hash1[out] 检查当前窗口内 out 的出现次数是否小于或等于 words 列表中 out 的出现次数。如果这两个条件都满足,说明 out 是一个有效的单词,当前窗口的有效单词计数 count 需要减少 1。*/if(hash1.count(out) && hash2[out] <= hash1[out]) {count--;}hash2[out]--; //更新 hash2 中 out 的计数:hash2[out]-- 将 out 在 hash2 中的计数减 1,因为 out 已经离开当前窗口left += len;//left += len 将窗口的左边界向右移动 len 个位置,准备进行下一步的窗口滑动}// 更新结果if(count == m) {ret.push_back(left);}}}return ret;}
};

图解

例如:s = "barfoothefoobarman", words = ["foo","bar"]

da89f3529faaeb386e677ae8e73a3a0d

  1. hash1[foo]=1,hash1[bar]=1

    len=3,m=2

    in=bar,hash2[bar]++=1

    满足if(hash1.count(in) && hash2[in] <= hash1[in])count++

    right += len

0ac3a6e505200131657498f34f04bb3a

  1. in=foo,hash2[foo]++=1

    满足if(hash1.count(in) && hash2[in] <= hash1[in])count++

    满足if(count == m) ,所以ret.push_back(left);也就是0

    right += len

196c6ac40944cb385a42a2ce77589016

  1. in=the,hash2[the]++=1

    right += len

821a75f50cf5f12f89a08c6c78b087b6

  1. in=foo,hash2[foo]++=2

    满足if(right - left + 1 > len * m)out=barout不是有效字符,count不会减少,hash2[out]--;left += len;

    right += len

8a1b81cf8fde6fdd0ffbcdbc86935654

  1. 后面步骤类似,就不多赘述了

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

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

相关文章

NUMA架构及在极速网络IO场景下的优化实践

NUMA技术原理 NUMA架构概述 随着多核CPU的普及&#xff0c;传统的对称多处理器&#xff08;SMP&#xff09;架构逐渐暴露出性能瓶颈。为了应对这一问题&#xff0c;非一致性内存访问&#xff08;NUMA, Non-Uniform Memory Access&#xff09;架构应运而生。NUMA架构是一种内存…

论文笔记(五十七)Diffusion Model Predictive Control

Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划&#xff08;Planning&#xff09;3.4. 适应 4. 实验&#xff08;Experiments&#xff09;4.1. 对于固定奖励&#xff0c;D-MPC 可与其他离线 RL…

Android 13 Aosp Settings Android Studio版本

Android 13 Aosp Settings Android Studio版本 Settings相关源码 Settings https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android13-release SettingsIntelligence https://android.googlesource.com/platform/packages/apps/SettingsIn…

oracle 创建只可以查询权限用户+sqldeveloper如何看到对应表

声明 申明部分是从其他csdn用户哪里复制的&#xff0c;只是自己操作后发现无法达到我最后的预期&#xff0c;所以关闭忘记是看的那篇了&#xff0c;如果有侵权请见谅&#xff0c;联系我删除谢谢。 好了&#xff0c;故事的开始是我最近删投产表了。没错职业黑点&#xff0c;清…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链&#xff08;如 Liquid&#xff09;的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法&#xff0c;该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

软件测试丨Pytest生命周期与数据驱动

Pytest的生命周期概述 Pytest 是一个强大的测试框架&#xff0c;提供了丰富的特性来简化测试执行。它的生命周期包括多个阶段&#xff0c;涉及从准备测试、执行测试到报告结果的完整流程。因此&#xff0c;理解Pytest的生命周期将帮助我们更好地设计和管理测试用例。 开始阶段…

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前&#xff0c;我们都在讲什么低代码/无代码平台&#xff0c;这个概念很久了&#xff0c;但是&#xff0c;一直没有很好的落地&#xff0c;整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来&#xff0c;各大科技公司也都推出了很多 AI 代码助手&#xff…

Python学习——猜拳小游戏

import random player int(input(“请输入&#xff1a;剪刀 0&#xff0c;石头 1&#xff0c;布2”)) computer random.randint(0,2)# print(“玩家输入的是%d&#xff0c;电脑输入的是%d” %(player,computer)) 用于测试 if (player 0) and (computer 0) or (player 1) a…

从零样本到少样本学习:一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用!

爆款标题&#xff1a; 《从零样本到少样本学习&#xff1a;一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用&#xff01;》 正文&#xff1a; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Zero-shot、One-shot 和 Few-shot 学习已经成为衡量大语言…

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统&#xff1a;kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能&#xff0c;还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统&#xff1a;kafka把消息持久化到磁盘上&#xff0c…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后&#xff0c;通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范&#xff0c;遵循这套规范&#xff0c;任…

@sun.misc.Contended

某个类有以下两个属性 volatile int a; volatile int b; int为4字节&#xff0c;两个int为8字节&#xff0c;一个缓存行大小为64字节 故一旦缓存行a失效了&#xff0c;但是b没失效&#xff0c;会连带着b一起失效&#xff0c;因为失效最小的单位就是一个缓存行 这样子会导致效率…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …

解锁Scala编程:深入文本分析与数据处理的艺术

引言&#xff1a; 在数据科学的世界里&#xff0c;Scala以其强大的并发能力和简洁的语法&#xff0c;成为处理大规模数据集的理想选择。本文将带您踏上一段Scala编程的探索之旅&#xff0c;从基础的文本分析到复杂的数据处理&#xff0c;每一步都精心设计&#xff0c;让您在实…

Top 10 Tools to Level Up Your Prompt Engineering Skills

此文章文字是转载翻译&#xff0c;图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1&#xff0c;Prompt Engineering 提示工程…

【RK3588 Linux 5.x 内核编程】-内核线程与读写自旋锁

内核线程与读写自旋锁 文章目录 内核线程与读写自旋锁1、读写自旋锁介绍2、Linux内核中的读写自旋锁2.1 初始化2.1.1 静态方法2.1.2 动态方法3、读写自旋锁加锁与解锁3.1 在用户上下文之间锁定3.1.1 读锁3.1.2 写锁3.2 下半部分之间的锁定3.3 在用户上下文和下半部分之间锁定3.…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE&#xff0c;javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

Oracle, PostgreSQL 字符串排序不一致及调整

有一个使用了不同数据库的应&#xff0c;Oracle 和 PostgreSQL&#xff0c;数据库中的记录完全相同&#xff0c;相同的查询语句(相同的排序&#xff0c;至少从字面上来说是的)取到的记录排序却不同&#xff0c;从而产生了 Bug。 简单演示一下默认排序各自在这两种数据库中的行为…