串联所有单词的子串 ---- 滑动窗口

题目链接

题目:

分析:

我们上次做的题目, 是找到所有字符的异位词, 和这道题有些类似, 使用记录有效字符的个数找到子字符, 此题无非是把字符变成了字符串题目回顾   有一下几方面不同, 我们以示例1为例:

1. 哈希表

上次我们使用的是哈希数组, 因为数组的下标可以是字符, 现在变成字符串, 所以我们可以使用hashMap<String,Integer>来映射字符串和出现次数的关系

2. 窗口大小

words数组的长度为2, 那么窗口大小就固定了是2, 但是每个元素是长度len为3的字符串, 所以真正的窗口大小应该是2*3 = 6

3. left和right移动距离

因为我们要找的是字符串, 所以left和right每次需要移动len个字符, 才能找到下一个字符串

4. 遍历次数

但是如果left和right从零开始, 每次移动len个字符, 不能够找到所有的长度为len子字符串, 所以我们需要重新遍历字符串, 此时从0的下一个位置开始, 每次移动len个字符, 如果我们想找到所有的长度为len字符串, 只需循环len次就可以, 每次都从下一个位置开始, 因为循环len+1次, 会和从0位置开始遍历的重复

 思路:

  1. 使用hashMap<String,Integer>, 将words中的元素记录在hash1中
  2. 定义begin来记录遍历次数及每次遍历开始的位置
  3. 定义 left = begin, right = begin, 有效个数count = 0
  4. 定义hash2存放每次遍历的窗口(注意: 不能在循坏外定义hash2, 因为每次循环都应该重新new一个hash记录窗口情况)
  5. 进窗口 此时的条件应该是right+len<=s.length(), 因为我们要从right截取len大小的字符串, 如果像以前写成right<s.length(), 可能会导致越界, 截取子字符串使用substring()方法, 每次right移动len
  6. 进窗口后, 判断count的值是否需要变化
  7. 判断 如果窗口的大小 > words数组中的字符总长度, 则出窗口
  8. 出窗口前, 判断count的值是否需要变化
  9. 出窗口 每次left移动len
  10. 更新结果 如果count == 字符串的个数, 说明找到此子字符串, 记录left

代码:

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> list = new ArrayList<>();Map<String, Integer> hash1 = new HashMap<>();for (int i = 0; i < words.length; i++) {hash1.put(words[i], hash1.getOrDefault(words[i], 0) + 1);}int begin = 0;int len = words[0].length();while (begin < len) {int left = begin;int right = begin;int count = 0;Map<String, Integer> hash2 = new HashMap<>();while (right + len <= s.length()) {String in = s.substring(right, right + len);hash2.put(in, hash2.getOrDefault(in, 0) + 1);if (hash2.getOrDefault(in, 0) <= hash1.getOrDefault(in, 0))count++;if (right - left + 1 > words.length*len) {String out = s.substring(left, left + len);if (hash2.getOrDefault(out, 0) <= hash1.getOrDefault(out, 0))count--;hash2.put(out, hash2.get(out) - 1);left += len;}if (count == words.length) {list.add(left);}right += len;}begin++;}return list;}
}

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

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

相关文章

织梦dedecms企业网站模板安装教程

很多新手在拿到织梦模板后不知道如何安装&#xff0c;所以&#xff0c;云部落(Yunbuluo.Net)资源网专门整理了一份图文版织梦模板通用安装教程&#xff0c;希望对大家有所帮助。 第一步&#xff1a; 将域名解析绑定好之后&#xff0c;上传下载的模板至您的WEB根目录中&#xf…

YOLOv5独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv5结合:替代YOLOv5的backbone 收录 YOL…

C51 单片机编程模板及编码规范

文章目录 一、C51 单片机模板创建1. 新建工程及选型2. 创建主程序文件3. 创建主程序的头文件4. 编译配置5. 其他 二、C51 的编码规范 在查阅了很多关于 C51 单片机的程序后&#xff0c;个人感觉目前网上有关 C51 单片机程序的质量参差不齐&#xff0c;很多程序的代码风格及其糟…

YOLOv9改进策略 | 低照度图像篇 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

一、本文介绍 本文给大家带来的2024.3月份最新改进机制&#xff0c;由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络&#xff0c;CPA-Enhancer通过引入链式思考提示机制&am…

详解xlswriter 操作Excel的高级应用conditional_format

在文章详解xlsxwriter 操作Excel的常用API-CSDN博客 我们介绍了xlswriter 基础api的使用情况&#xff0c;在实际工作中我们经常会遇到下面的需求&#xff0c;cell满足某某条件时&#xff0c;进行对应的格式化处理。这时候我们可以使用conditional_format的函数&#xff0c;他允…

C语言----斐波那契数列(附源代码)

各位看官们好&#xff0c;当我写了上一篇博客杨辉三角后&#xff0c;有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和&#xff0c;然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

echarts map地图添加背景图

给map地图添加了一个阴影3d的效果&#xff0c;添加一张背景图&#xff0c;给人感觉有3d的效果 具体配置如下&#xff1a; html代码模块&#xff1a; <div class"echart_img" style"position: fixed; visibility: hidden;"></div><div id&q…

【正则表达式】1、元字符的认识与分类

1、元字符的概念 正则表达式的常见功能&#xff0c;分别是校验数据的有效性、查找符合要求的文本以及对文本进行切割和替换等操作。 我想你一定在办公软件&#xff0c;比如 Word、Excel 中用过这个功能。你可以使用查找功能快速定位关注的内容&#xff0c;然后使用替换&#xf…

【谷粒商城】04.快速开发

1.克隆代码 https://gitee.com/renrenio DELLLJL MINGW64 ~/Desktop $ git clone https://gitee.com/renrenio/renren-fast.git Cloning into renren-fast... remote: Enumerating objects: 1965, done. remote: Counting objects: 100% (1965/1965), done. remote: Compress…

查看Linux系统是Ubuntu还是CentOS

要查看Linux系统是Ubuntu还是CentOS&#xff0c;可以通过多种方式进行确认&#xff1a; 查看/etc/os-release文件&#xff1a; 在终端中执行以下命令&#xff1a; cat /etc/os-release 如果输出中包含"IDubuntu"&#xff0c;则表示系统是Ubuntu&#xff1b;如果输出中…

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;的一阶环形倒立摆控制系统&…

SpringBoot多模块项目MybatisPlus配置

项目目录 主模块配置 配置类 Configuration EnableTransactionManagement MapperScan("com.sms.**.mapper") public class MybatisPlugConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor new…