【滑动窗口】串联所有单词的⼦串(hard)
串联所有单词的⼦串(hard)
- 题⽬描述:
- 解法⼀(暴⼒解法):
- 算法思路:
- C++ 算法代码:
- Java 算法代码:
题⽬链接:30. 串联所有单词的⼦串
题⽬描述:
给定⼀个字符串 s 和⼀个字符串数组 words。 words 中所有字符串 ⻓度相同。
s 中的 串联⼦串 是指⼀个包含 words 中所有字符串以任意顺序排列连接起来的⼦串。
◦ 例如,如果 words = [“ab”,“cd”,“ef”], 那么"abcdef",“abefcd”,“cdabef”,“cdefab”,“efabcd”, 和 “efcdab” 都是串联⼦串。 “acdbef” 不是串联⼦串,因为他不是任何 words 排列的连接。
返回所有串联字串在 s 中的开始索引。你可以以 任意顺序 返回答案。
⽰例 1:
输⼊:s = “barfoothefoobarman”, words = [“foo”,“bar”]
输出:[0,9]
解释:因为 words.length = = 2 同时 words[i].length = = 3,连接的⼦字符串的⻓度必须为 6。
⼦串 “barfoo” 开始位置是 0。它是 words 中以 [“bar”,“foo”] 顺序排列的连接。
⼦串 “foobar” 开始位置是 9。它是 words 中以 [“foo”,“bar”] 顺序排列的连接。
输出顺序⽆关紧要。返回 [9,0] 也是可以的。
⽰例 2:
输⼊:s = “wordgoodgoodgoodbestword”, words = [“word”,“good”,“best”,“word”]
输出:[]
解释:因为 words.length = = 4 并且 words[i].length = = 4,所以串联⼦串的⻓度必须为 16。
s 中没有⼦串⻓度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回⼀个空数组。
⽰例 3:
输⼊:s = “barfoofoobarthefoobarman”, words = [“bar”,“foo”,“the”]
输出:[6,9,12]
解释:因为 words.length = = 3 并且 words[i].length = = 3,所以串联⼦串的⻓度必须为 9。
⼦串 “foobarthe” 开始位置是 6。它是 words 中以 [“foo”,“bar”,“the”] 顺序排列的连接。
⼦串 “barthefoo” 开始位置是 9。它是 words 中以 [“bar”,“the”,“foo”] 顺序排列的连接。
⼦串 “thefoobar” 开始位置是 12。它是 words 中以 [“the”,“foo”,“bar”] 顺序排列的连接。
提⽰:
1 <= s.length <= 104
1 <= words.length <= 5000
1 <= words[i].length <= 30
words[i] 和 s 由⼩写英⽂字⺟组成
解法⼀(暴⼒解法):
算法思路:
如果我们把每⼀个单词看成⼀个⼀个字⺟,问题就变成了找到「字符串中所有的字⺟异位词」。⽆⾮就是之前处理的对象是⼀个⼀个的字符,我们这⾥处理的对象是⼀个⼀个的单词。
C++ 算法代码:
class Solution{
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;unordered_map<string, int> hash1; // 保存 words ⾥⾯所有单词的频次for(auto& s : words) hash1[s]++;int len = words[0].size(), m = words.size();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);hash2[in]++;if(hash1.count(in) && hash2[in] <= hash1[in]) count++;// 判断if(right - left + 1 > len * m){// 出窗⼝ + 维护 countstring out = s.substr(left, len);if(hash1.count(out) && hash2[out] <= hash1[out]) count--;hash2[out]--;left += len;}// 更新结果if(count == m) ret.push_back(left);}}return ret;}
}
Java 算法代码:
class Solution{public List<Integer> findSubstring(String s, String[] words){List<Integer> ret = new ArrayList<Integer>();// 保存字典中所有单词的频次Map<String, Integer> hash1 = new HashMap<String, Integer>(); for(String str : words) hash1.put(str, hash1.getOrDefault(str, 0) + 1);int len = words[0].length(), m = words.length;for(int i = 0; i < len; i++) { // 执⾏次数// 保存窗⼝内所有单词的频次Map<String, Integer> hash2 = new HashMap<String, Integer>(); for(int left = i, right = i, count = 0; right + len <= s.length(); right += len){// 进窗⼝ + 维护 countString in = s.substring(right, right + len);hash2.put(in, hash2.getOrDefault(in, 0) + 1);if(hash2.get(in) <= hash1.getOrDefault(in, 0)) count++; // 判断if(right - left + 1 > len * m){// 出窗⼝ + 维护 countString out = s.substring(left, left + len);if(hash2.get(out) <= hash1.getOrDefault(out, 0)) count--;hash2.put(out, hash2.get(out) - 1);left += len;}// 更新结果if(count == m) ret.add(left);}}return ret;}
}
相关文章:
【滑动窗口】串联所有单词的⼦串(hard)
串联所有单词的⼦串(hard) 题⽬描述:解法⼀(暴⼒解法):算法思路:C 算法代码:Java 算法代码: 题⽬链接:30. 串联所有单词的⼦串 题⽬描述: 给定⼀…...
SQL注入之information_schema表
1 information_schema表介绍: information_schema表是一个MySQL的系统数据库,他里面包含了所有数据库的表名 SQL注入中最常见利用的系统数据库,经常利用系统数据库配合union联合查询来获取数据库相关信息,因为系统数据库中所有信…...
高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
如果有遗漏,评论区告诉我进行补充 面试官: Nacos如何处理网络分区情况下的服务可用性问题? 我回答: 在讨论 Nacos 如何处理网络分区情况下的服务可用性问题时,我们需要深入理解 CAP 理论以及 Nacos 在这方面的设计选择。Nacos 允许用户根据具体的应用…...
Elasticsearch:使用 ES|QL 进行搜索和过滤
本教程展示了 ES|QL 语法的示例。请参考 Query DSL 版本,以获得等效的 Query DSL 语法示例。 这是一个使用 ES|QL 进行全文搜索和语义搜索基础知识的实践介绍。 有关 ES|QL 中所有搜索功能的概述,请参考《使用 ES|QL 进行搜索》。 在这个场景中&#x…...
R语言之.rdata文件保存及加载
在 R 中,.rdata 文件是通过 save() 函数创建的。 使用 save() 函数可以将一个或多个 R 对象保存到 .rdata 文件中。使用 load() 函数可以将 .rdata 文件中的对象恢复到当前工作环境中。 1.创建并保存对象到.rdata 假设有一个基于 iris 数据集训练的线性回归模型&a…...
二进制和docker两种方式部署Apache pulsar(standalone)
#作者:闫乾苓 文章目录 1、二进制安装部署Pulsar(standalone)1.1 安装配置JDK1.2 下载解压pulsar安装包1.3 启动独立模式的Pulsar 集群1.4 创建主题测试1.5 向主题写入消息测试1.6 从主题中读取消息测试 2.docker安装部署Pulsar(standalone)2.1 使用docker 启动Pul…...
MySQL表与表之间的左连接和内连接
前言: 在上个实习生做的模块之中,在列表接口,涉及到多个表的联表查询的时候总会出现多条不匹配数据的奇怪的bug,我在后期维护的时候发现了,原来是这位实习生对MySQL的左连接和内连接不能正确的区分而导致的这种的情况。 表设置 …...
RAG知识库中引入MCP
MCP(Memory, Context, Planning)是一种增强AI系统认知能力的框架。将MCP引入RAG知识库可以显著提升系统的性能和用户体验。下面我将详细介绍如何实现这一整合。 MCP框架概述 MCP框架包含三个核心组件: Memory(记忆):存储和管理历史交互和知识Context(上下文):理解当…...
TDengine 性能监控与调优实战指南(二)
四、TDengine 性能调优实战 4.1 硬件层面优化 硬件是 TDengine 运行的基础,其性能直接影响着 TDengine 的整体表现。在硬件层面进行优化,就如同为高楼大厦打下坚实的地基,能够为 TDengine 的高效运行提供有力支持。 CPU:CPU 作…...
低代码开发平台:企业数字化转型的加速器
一、引言 在数字化时代,企业的转型需求日益迫切。为了在激烈的市场竞争中保持领先地位,企业需要快速响应市场变化、优化业务流程、提升运营效率。然而,传统的软件开发模式往往面临开发周期长、成本高、灵活性差等问题,难以满足企业…...
【AI图像创作变现】02工具推荐与差异化对比
引言 市面上的AI绘图工具层出不穷,但每款工具都有自己的“性格”:有的美学惊艳但无法微调,有的自由度极高却需要动手配置,还有的完全零门槛适合小白直接上手。本节将用统一格式拆解五类主流工具,帮助你根据风格、控制…...
相控阵列天线:原理、优势和类型
本文要点 相控阵列天线 (Phased array antenna) 是一种具有电子转向功能的天线阵列,不需要天线进行任何物理移动,即可改变辐射讯号的方向和形状。 这种电子转向要归功于阵列中每个天线的辐射信号之间的相位差。 相控阵列天线的基…...
【HD-RK3576-PI】Ubuntu桌面多显、旋转以及更新Logo
硬件:HD-RK3576-PI 软件:Linux6.1Ubuntu22.04 在基于HD-RK3576-PI硬件平台运行Ubuntu 22系统的开发过程中,屏幕方向调整是提升人机交互体验的关键环节。然而,由于涉及uboot引导阶段、内核启动界面、桌面环境显示全流程适配&#x…...
树莓派超全系列教程文档--(36)树莓派条件过滤器设置
树莓派条件过滤器设置 条件过滤器[all] 过滤器型号过滤器[none] 过滤器[tryboot] 过滤器[EDID*] 过滤器序列号过滤器GPIO过滤器组合条件过滤器 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 条件过滤器 当将单个 SD 卡(或卡图像&am…...
【Rust 精进之路之第3篇-变量观】`let`, `mut` 与 Shadowing:理解 Rust 的变量绑定哲学
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:为数据命名,Rust 的第一道“安全阀” 在上一篇文章中,我们成功搭建了 Rust 开发环境,并用 Cargo 运行了第一个程序,迈出了坚实的一步。现在,是时候深入了解构成程序的基…...
wordpress独立站的产品详情页添加WhatsApp链接按钮
在WordPress外贸独立站的产品展示页添加WhatsApp链接按钮,可以帮助客户更方便地与你联系。以下是实现这一功能的步骤: 方法一:使用HTML代码添加按钮 编辑产品展示页 进入WordPress后台,找到需要添加WhatsApp按钮的产品展示页。…...
jetpack之LiveData的原理解析
前言 在一通研究下,我打算LiveData的解析通过从使用的方法上面切入进行LiveData的工作原理分析😋。感觉这样子更能让大家伙理解明白,LiveData的实现和Lifecycle分不开,并且还得需要知道LiveData的使用会用到什么样的方法。所以&a…...
Viper配置管理笔记
一、什么是 Viper? Viper 是 Go 语言的一个强大工具,就像一个超级管家,专门负责帮你打理程序的各种配置。它能把配置文件(比如 JSON、YAML、TOML 等格式)里的内容读出来,还能监控配置文件的变化࿰…...
go+mysql+cocos实现游戏搭建
盲目的学了一段时间了,刚开始从Box2d开始学习,明白了很多,Box2d是物理模型的基础,是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos,也是小程序开发的利器,而golang是一款高效…...
【微知】服务器如何获取服务器的SN序列号信息?(dmidecode -t 1)
文章目录 背景命令dmidecode -t的数字代表的字段 背景 各种场景都需要获取服务器的SN(Serial Number),比如问题定位,文件命名,该部分信息在dmi中是标准信息,不同服务器,不同os都能用相同方式获…...
Android开发中广播(Broadcast)技术详解
在 Android 开发中,广播(Broadcast) 是一种广泛使用的组件通信机制,它允许应用程序在不直接交互的情况下传递消息。本文将详细讲解 Android 广播的基本概念、类型、发送与接收流程、使用场景及注意事项,并结合具体的代…...
MySQL视图高级应用与最佳实践
1. 视图与索引的协同优化 物化视图(模拟实现) MySQL原生不支持物化视图,但可通过“定时刷新”的物理表模拟: -- 1. 创建存储结果的物理表 CREATE TABLE cached_monthly_sales (product_id INT,total_sales DECIMAL(10…...
xss4之cookie操作
一、登录网站情况分析 1. 登录状态与Cookie的关系 已登录状态: 当用户登录网站后,如admin123456,网站会通过某种方式(如Cookie)在客户端保存用户的登录状态。Cookie的作用: Cookie是服务器发送到用户浏览器并保存在本地的一小块…...
51c大模型~合集119
我自己的原文哦~ https://blog.51cto.com/whaosoft/13852062 #264页智能体综述 MetaGPT等20家顶尖机构、47位学者参与 近期,大模型智能体(Agent)的相关话题爆火 —— 不论是 Anthropic 抢先 MCP 范式的快速普及,还是 OpenAI …...
Vue3 + TypeScript,关于item[key]的报错处理方法
处理方法1:// ts-ignore 注释忽略报错 处理方法2:item 设置为 any 类型...
【记录】服务器用命令开启端口号
这里记录下如何在服务器上开启适用于外界访问的端口号。 方法 1 使用防火墙 1 su ,命令 输入密码 切换到root节点 2 开启防火墙 systemctl start firewalld3 配置开放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重启防火墙 firewall-cmd…...
如何优雅地实现全局唯一?深入理解单例模式
如何优雅地实现全局唯一?深入理解单例模式 一、什么是单例模式? 单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并为该实例提供全局访问点,从而避免全局变量的命名污染,并支持延迟初始化Wiki…...
25.4.20学习总结
如何使用listView组件来做聊天界面 1. 什么是CellFactory? 在JavaFX中,控件(比如ListView、TableView等)用Cell来显示每一条数据。 Cell:代表这个单元格(即每个列表项)中显示的内容和样式。 …...
Spring之我见 - Spring Boot Starter 自动装配原理
欢迎光临小站:致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置,其核心实现基于 自动配置(Auto-Configuration) 和 条件化注册(Conditional Registration)。以下是其生效原理: 约定…...
如何高效利用呼叫中心系统和AI语音机器人
要更好地使用呼叫中心系统和语音机器人,需要结合两者的优势,实现自动化、智能化、高效率的客户服务与业务运营。以下是优化策略和具体实践方法: 一、呼叫中心系统优化 1. 智能路由与IVR优化 智能ACD(自动呼叫分配) …...
