【Java刷题篇】串联所有单词的子串

这里写目录标题

  • 📃1.题目
  • 📜2.分析题目
  • 📜3.算法原理
  • 🧠4.思路叙述
    • ✍1.进窗口
    • ✍2.判断有效个数
    • ✍3.维护窗口
    • ✍4.出窗口
  • 💥5.完整代码

📃1.题目

力扣链接: 串联所有单词的子串
在这里插入图片描述
在这里插入图片描述

📜2.分析题目

阅读题目后,可以拿到一个关键信息–words中所有字符串长度相等,这后续解题思路的一大关键,还有就是串联字串的字符串顺序可以不同。得到这两个关键信息后,我们就很容易联想到运用滑动窗口这个算法来解决问题。
好分析完题目后,我们就开始讲解算法的原理,如果你懂得滑动窗口的原理话,可以跳过直接观看算法原理的讲解。

📜3.算法原理

在此篇文章前,已经发布关于滑动窗口的讲解。
博客链接: 滑动窗口

🧠4.思路叙述

先前滑动窗口解决的问题,要么是一个数字一个数字进行遍历,要么是一个字符一个字符进行遍历,今天这题与众不同的是以一个字符串为单位进行遍历,使用哈希表来进行存储。

  • 我们创建两个哈希表。
  • 我们将words中的字符串存入哈希表1中。
  • 我们在循环遍历s的过程中,每遍历一个字符串就将其加入哈希表2中
  • 并且同时进行有效个数的判断以及维护窗口
  • 最后通过有效个数的比较返回值

✍1.进窗口

还是定义left和right左右指针来对窗口进行划分。每一次right和left指针递增的长度是words中字符串的长度,此时有一个难题,那就是从什么位置开始遍历呢?从第一个字符的位置开始遍历?
在这里插入图片描述
那么这种情况该如何处理?这种情况行不通,我们可以每个位置都进行尝试
从0–len的位置都进行尝试,这样就完美的解决了这个问题。
在这里插入图片描述

 int len = words[0].length();for (int i = 0; i < len; i++) {//整体大循环控制}

✍2.判断有效个数

我们创建两个哈希表。

HashMap<String,Integer> hashMap1 = new HashMap<>();
HashMap<String,Integer> hashMap2 = new HashMap<>();

我们将words中的字符串存入哈希表1中。

for (String ss:words) {hashMap1.put(ss, hashMap1.getOrDefault(ss,0)+1);}

首先确定循环的条件,由上述讲解中已经提到right的起始位置

 for (int right = i,left = i,count = 0; right+len <= s.length() ; right+= len) {}

我们在循环遍历s的过程中,每遍历一个字符串就将其加入哈希表2中,并且与哈希表1中存入的字符串进行比较,如果相同,有效个数就+1

   String in = s.substring(right,right+len);hashMap2.put(in,hashMap2.getOrDefault(in,0)+1);if (hashMap2.get(in) <= hashMap1.getOrDefault(in,0)){count++;}

✍3.维护窗口

再次过程中,我们要保证窗口的大小。同words中字符个数相等的窗口。

     int len = words[0].length();int m = words.length;if (right - left +1 > m*len){//出窗口}

✍4.出窗口

  String out = s.substring(left,left+len);if (hashMap2.get(out) <= hashMap1.getOrDefault(out,0)){count--;}hashMap2.put(out,hashMap2.get(out)-1);left+= len;

💥5.完整代码

 public List<Integer> findSubstring(String s, String[] words) {List<Integer> list = new ArrayList<>();int len = words[0].length();int m = words.length;HashMap<String,Integer> hashMap1 = new HashMap<>();for (String ss:words) {hashMap1.put(ss, hashMap1.getOrDefault(ss,0)+1);}//大条件for (int i = 0; i < len; i++) {HashMap<String,Integer> hashMap2 = new HashMap<>();//入口位置的处理for (int right = i,left = i,count = 0; right+len <= s.length() ; right+= len) {//进窗口String in = s.substring(right,right+len);hashMap2.put(in,hashMap2.getOrDefault(in,0)+1);//有效个数的判断if (hashMap2.get(in) <= hashMap1.getOrDefault(in,0)){count++;}//窗口大小的维护if (right - left +1 > m*len){//出窗口String out = s.substring(left,left+len);if (hashMap2.get(out) <= hashMap1.getOrDefault(out,0)){count--;}hashMap2.put(out,hashMap2.get(out)-1);left+= len;}//判断条件是否符合要求if (count == m){list.add(left);}}}return list;}

以上就是所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

长连接技术

个人学习记录&#xff0c;欢迎指正 1.轮询 1.1 轮询的形式 短连接轮询 前端每隔一段时间向服务端发起一次Http请求来获取数据。 const shortPolling () > { const intervalHandler setInterval(() > {fetch(/xxx/yyy).then(response > response.json()).then(respo…

企业计算机服务器中了devicdata勒索病毒怎么办,devicdata勒索病毒解密工具流程

随着科学技术的不断发展与应用&#xff0c;越来越多的企业开始利用网络开展各项工作业务&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;大大提高了生产运营效率&#xff0c;同时也为企业的发展规划带来不错的契机。但网络是一把双刃剑&#xff0c;网络在为人们提…

HAProxy高性能负载均衡器

一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器&#xff0c;它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡&#xff0c;还能应用于数据…

AI大浪潮,怎能少了国产HBM内存?

据有关报道显示&#xff0c;武汉新芯半导体制造有限公司&#xff08;XMC&#xff09;正在启动一项专注于开发和生产高带宽内存&#xff08;HBM&#xff09;的项目。 HBM作为一种关键的DRAM类型&#xff0c;对于人工智能&#xff08;AI&#xff09;和高性能计算&#xff08;HPC&…

腾讯云轻量应用服务器2核4G5M代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

智慧公厕建设的主要目标是什么?

随着城市化进程的不断推进&#xff0c;公共厕所作为城市基础设施的重要组成部分&#xff0c;也变得越来越重要。为了提升公共厕所的管理水平、提供更好的服务质量&#xff0c;智慧公厕应运而生。智慧公厕的建设旨在通过信息化手段实现公共厕所的全面感知监测&#xff0c;实现公…

Jmeter文件上传不成功问题

前言 最近好忙呀&#xff0c;项目上线然后紧接着又客户培训了&#xff0c;由于项目有个模块全是走配置的&#xff0c;所以导致问题不断&#xff0c;近期要培训为了保障培训时客户同时操作的情况&#xff0c;所以把我从功能端抽出来做压测了&#xff0c;之前安排了2个同事写压测…

力扣24. 两两交换链表中的节点

新建虚拟头节点&#xff0c;用3个指针记录前3个节点&#xff0c;然后再相互赋值指向&#xff0c;再移动当前节点&#xff0c;当前节点所在的位置&#xff0c;只能交换该节点的后两个节点&#xff08;所以必须建立虚拟头节点&#xff0c;才能操作第1&#xff0c;2个节点&#xf…

ts版本微信小程序在wxml保存文件不刷新页面的解决办法

将project.config.json中的skylineRenderEnable改为false "skylineRenderEnable": false

python爬虫-AES.CBS加密案例(mmz批量爬取)

下载mmz本页数据 批量下载请看主页&#xff01;&#xff01;&#xff01; 代码&#xff1a; import requests from Crypto.Cipher import AES import base64cookies {PHPSESSID: 48nu182kdlsmgfo2g7hl6eufsa,Hm_lvt_6cd598ca665714ffcd8aca3aafc5e0dc: 1710568549,SECKEY_A…

Redis学习笔记(基础篇)

Redis基础 1 Redis是什么&#xff1f;1.1 键值型1.2 NoSQL1.2.1 NoSQL与SQL的区别是什么1.2.2 总结 1.3 Redis的特点是什么&#xff1f; 2 Redis怎么用&#xff1f;2.1 Redis的基本命令2.2 Key的层级结构2.3 Redis的基本数据类型有哪些&#xff1f;2.1.1 String类型2.1.2 Hash类…

终止代码: DRIVER IRQL NOT LESS OR EQUAL 失败的操作:Netwtw12.sys

蓝屏警告&#xff1a; 今天电脑浏览器用着用着就蓝屏重启&#xff0c;蓝屏上报这个错误&#xff1a; 上网找了一堆&#xff0c;发现关键是这句话&#xff1a;“失败的操作:Netwtw12.sys” 最终在一顿操作下&#xff0c;发现了是23年更新的网卡&#xff08;Intel(R) Wi-Fi6E A…

短剧小程序软件开发首页接口转发到Selectpage

工具&#xff1a;用的是uniapp开发 技术栈&#xff1a;vue、nide..js、云开发 用时&#xff1a;20工作天 软件&#xff1a;Hb、微信开发者工具 <?php namespace app\api\controller; use app\common\controller\Api; /** * 首页接口 */ class Index extends Api { …

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

基于web的精品课程网站设计

基于web的精品课程网站设计 C#asp.netSqlServer 带论文 功能模块&#xff1a; 基于web的精品课程网站设计 C#asp.netSqlServer 学生功能模块 学生登录系统后&#xff0c;可以在留言板页面给老师进行留言&#xff0c;并且可以查看课程和题库 可以在首页进行考试并且可以修改…

从电影《沙丘》说起——对人工智能的思考

从《沙丘》开始说起 之前看《沙丘》电影&#xff0c;里面有一类角色叫门泰特&#xff0c;这类人大脑可以飞快地运算&#xff0c;在电影设定里是替换人工智能、机器运算的存在。男主保罗也是这类型的人&#xff0c;但他可能基因更强大&#xff0c;吸食了香料后&#xff0c;他的…

力扣111---二叉树的最小深度(简单题,Java,递归+非递归)

目录 题目描述&#xff1a; &#xff08;递归&#xff09;代码&#xff1a; &#xff08;非递归、层次遍历&#xff09;代码&#xff1a; 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

1、计划任务介绍

Windows计划任务介绍 1、含义&#xff1a; 简单点就是定时执行任务。 在许多场景下&#xff0c;我们定时执行一些任务。比如&#xff1a;定时拉取、备份文件&#xff0c;更新代码等等操作。 WinR打开运行框&#xff0c;输入&#xff1a;control schedtasks&#xff0c;就会…

大胆投资自己

> Keep Thinking 保持思考 1. 关于投资 首先需要做到 “ 精明 ” 的活着&#xff0c;如何做到精明呢&#xff1f; 所谓精明&#xff0c;也即清醒认识到自己当前所处的阶段&#xff0c;清楚知道下一步的应该朝哪一个方向努力&#xff01;人生就是一场长跑&#xff0c; 我们…

如何订阅Midjourney

Midjourney介绍 Midjourney作为目前AI绘画领域效果卓越且备受青睐的工具&#xff0c;对于新用户而言&#xff0c;可能无法享受到免费试用的机会。因此&#xff0c;为了持续利用这款软件进行绘画创作&#xff0c;用户需要购买会员资格并开通订阅服务。那么&#xff0c;关于midj…