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

题目链接

题目:

分析:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生产透明化,交付无烦恼

生产进度总延误 质量把控总失守 计划赶不上变化 沟通不畅易误解 ...... 这些问题可能在一些工厂管理中几乎每天都在上演。 在如今快速变化的市场环境中&#xff0c;企业的生产效率和交付能力成为了衡量其竞争力的关键指标。而要实现高效、准确的生产和交付&#xff0c;透明化的…

JVM调优-调优原则和原理分析

1.写在前面 对于JVM调优这个话题&#xff0c;可能大部分程序员都听过这个名词。 但是绝大多数程序员&#xff0c;都没有真真实实去干过&#xff0c;都没有真实的实践过。也不懂得如何调优&#xff1f;不知道要调成怎么样&#xff1f; 那今天咋们就对这个话题来展开描述一下&…

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后&#xff0c;我们来认识一下目录的结构&#xff1a; 一、目录 &#xff08;1&#xff09;目录的特点 windows特点&#xff1a; Windows中有C、D、E盘&#xff0c;每个都是一个根系统 Linux特点&#xff1a; linux中只有一个根&#xff08;单…

富在术数,不在劳身 财富的积累更多依赖于智慧和策略,而不是单纯的体力劳动 GPT-4o免费用

"富在术数&#xff0c;不在劳身"这句话的意思是财富的积累更多依赖于智慧和策略&#xff0c;而不是单纯的体力劳动。这句话强调了智慧和技巧在获取财富过程中的重要性&#xff0c;提示人们在追求财富时&#xff0c;应注重策略和方法的运用&#xff0c;而不仅仅依靠辛…

【正点原子Linux连载】第四十一章 Linux wifi驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

服务的war包已经丢在tomcat中但是还是没法访问,如何排查?

问题出现的现象是我已经将 XWiki 的 WAR 包放置在 Tomcat 的 webapps目录下但仍然无法访问&#xff0c;反思之后可以从下面以下几个方面来诊断和解决问题&#xff1a; 1. 确认 Tomcat 正在运行 首先&#xff0c;确保 Tomcat 服务正在正常运行。可以使用以下命令检查 Tomcat 的…

嵌入式科普(16)c语言函数参数的传递方式

目录 一、概述 二、C函数参数 2.1 一张图讲清 2.2 按数据类型分类&#xff1a; 2.2.1 基本数据类型参数&#xff1a; 2.2.2 数组参数&#xff1a; 2.2.3 结构体参数&#xff1a; 2.2.4 指针参数&#xff1a; 2.2.5 函数指针参数&#xff1a; 2.3 按传递方式分类&…

nestjs封装一个响应体

封装一个DTO // response.dto.tsimport {CallHandler,ExecutionContext,Injectable,NestInterceptor, } from "nestjs/common"; import { FastifyReply } from "fastify"; import { Observable } from "rxjs"; import { map } from "rxjs/…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …

浅谈音频鉴黄技术

随着互联网的迅猛发展和网络智能化的普及&#xff0c;音视频内容已成为互联网传播的主流形式&#xff0c;各大视频网站、直播平台及短视频应用不断涌现&#xff0c;为亿万用户提供了丰富多样的娱乐和资讯内容。然而&#xff0c;这种繁荣背后也隐藏着不容忽视的问题&#xff1a;…

如何申请免费一年SSL证书

申请免费一年的SSL证书可以通过以下几个步骤进行&#xff0c;这里以JoySSL为例&#xff0c;因为它是目前提供此类服务的流行平台之一&#xff0c;同时也提到了宝塔面板中的TrustAsia SSL证书。请根据您的具体需求选择合适的方式&#xff1a; 申请免费一年SSL证书&#xff1a; …

MIT 6.5840(6.824) Lab1:MapReduce 设计实现

1 介绍 本次实验是实现一个简易版本的MapReduce&#xff0c;你需要实现一个工作程序&#xff08;worker process&#xff09;和一个调度程序&#xff08;coordinator process&#xff09;。工作程序用来调用Map和Reduce函数&#xff0c;并处理文件的读取和写入。调度程序用来协…

游戏数值策划关卡策划文案策划系统策划及游戏运营干货

1.《游戏新手村》免费电子书 我2007年开始做网络游戏&#xff0c;后面又做过网页游戏和手机游戏。当时市面上关于游戏策划和运营的书籍屈指可数&#xff0c;于是我就想着要不我写一本吧&#xff0c;然后2014年10月开始撰写。关于本书的更多信息可查看这篇文章>> 游戏新手…

论Java和C++方向选择

目录 1.难度2.就业压力3.岗位选择4.薪资待遇5.选择建议小结 1.难度 Java &#xff0c;C&#xff0c; 测开&#xff0c;整体来说三个方向难度相当。 1.仅从语法角度来看&#xff0c;c 是掌控一切&#xff0c;知识都要懂一点&#xff0c;而java的特点在于省心&#xff0c;都封装…

Google如何做医疗大模型(Med-Gemini)

1. 前言 开发垂直领域模型的方法有好几种&#xff0c;其中医疗、法律等专业是比较能体现模型垂直行业能力的&#xff0c;因此也深受各大厂商的重视。 五一小长假的第一天&#xff0c;Google在Arxiv上发布了《Capabilities of Gemini Models in Medicine 》 ( https://arxiv.o…

大模型LLM 结合联网搜索增强isou

参考&#xff1a; https://github.com/yokingma/search_with_ai 在线使用网址&#xff1a; https://isou.chat/ 安装github下载&#xff0c;运行docker compose 如果一直报下面错误&#xff1a; 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开&a…

nginx 发布静态资源

一. nginx 发布静态资源 在nginx中nginx.conf配置文件中添加内容如下&#xff1a; server {listen 90;server_name localhost;# 配置静态资源文件&#xff0c;就可以访问了location / {root /home/fooie-shop;index index.html;}# 配置音频和图片资源location /imoo…

NSSCTF | [SWPUCTF 2021 新生赛]babyrce

打开题目&#xff0c;显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…

Java——多线程

一.多线程 1.什么是多线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程的实际运作单位 简单理解多线程就是应用软件中相互独立&#xff0c;可以同时运行的功能(也可以理解为人体内相互独立&#xff0c;但可以同时运行的器官⌓‿⌓) 我们…

排序-冒泡排序(bubble sort)

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…