当前位置: 首页 > news >正文

LeetCode(32)串联所有单词的子串【滑动窗口】【困难】(含图解)

在这里插入图片描述

目录

    • 1.题目
    • 2.答案
    • 3.提交结果截图
    • 4.图解

链接: 串联所有单词的子串

1.题目

给定一个字符串 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 <= 10^4
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 30
  • words[i]s 由小写英文字母组成

2.答案

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> result = new ArrayList<>();int wordLength = words[0].length();int wordCount = words.length;for (int i = 0; i < wordLength; i++) {// 超出长度if (i + wordCount * wordLength > s.length()) {break;}// 初始化窗口Map<String, Integer> map = new HashMap<>();for (int j = 0; j < wordCount; j++) {String word = s.substring(i + j * wordLength, i + (j + 1) * wordLength);map.put(word, map.getOrDefault(word, 0) + 1);}// 筛掉原单词数组for (String word : words) {map.put(word, map.getOrDefault(word, 0) - 1);if (map.get(word) == 0) {map.remove(word);}}// 滑动窗口for (int j = 0; i + j + wordCount * wordLength <= s.length(); j+=wordLength) {if (j != 0) {String addWord = s.substring(i + j + wordLength * (wordCount - 1), i + j + wordLength * wordCount);map.put(addWord, map.getOrDefault(addWord, 0) + 1);if (map.get(addWord) == 0) {map.remove(addWord);}String delWord = s.substring(i + j - wordLength, i + j);map.put(delWord, map.getOrDefault(delWord, 0) - 1);if (map.get(delWord) == 0) {map.remove(delWord);}}if (map.size() == 0) {result.add(i + j);}}}return result;}
}

3.提交结果截图

在这里插入图片描述

4.图解

以如下测试用例举例说明:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]

首先,可以将字符串 s 按照单词长度进行划分,通过开头跳过字符长度的方式,可以分为以下三种划分方式。

在这里插入图片描述

以划分方式1举例,可以将所有单词总长度(单词数 * 单词长度)来作为一个窗口,从左往右滑动。

在这里插入图片描述

在这里插入图片描述

最终得到的 index=0index=9 就是我们的结果了。

整理完毕,完结撒花~ 🌻

相关文章:

  • 【MATLAB源码-第89期】基于matlab的灰狼优化算法(GWO)无人机三维路径规划,输出做短路径图和适应度曲线
  • 域名和ip的关系
  • Ajax 是什么? 如何创建一个 Ajax?
  • Docker 命令详解
  • 小程序如何禁止指定用户访问?如何设置指定用户才能访问?
  • 【虚拟机】在VM中安装 CentOS 7
  • 如何使用 Java 在Excel中创建下拉列表
  • Linux CenTOS命令备忘
  • Go语言的学习笔记2——Go语言源文件的结构布局
  • 【100个Cocos实例】编码不规范,接手泪两行...
  • Spring Cloud+Nacos 注册中心详解及开发示例
  • web:[WUSTCTF2020]朴实无华
  • Spring Boot 实现 PDF 水印,实战来了!
  • C语言基础篇5:指针(二)
  • leetcode42接雨水问题
  • [译]CSS 居中(Center)方法大合集
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Angular 4.x 动态创建组件
  • axios 和 cookie 的那些事
  • Git的一些常用操作
  • JavaScript学习总结——原型
  • JAVA并发编程--1.基础概念
  • Otto开发初探——微服务依赖管理新利器
  • python3 使用 asyncio 代替线程
  • Tornado学习笔记(1)
  • Vue.js 移动端适配之 vw 解决方案
  • windows下mongoDB的环境配置
  • 对象管理器(defineProperty)学习笔记
  • 检测对象或数组
  • 网络应用优化——时延与带宽
  • 微信小程序设置上一页数据
  • 优化 Vue 项目编译文件大小
  • 《天龙八部3D》Unity技术方案揭秘
  • Java数据解析之JSON
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #《AI中文版》V3 第 1 章 概述
  • #FPGA(基础知识)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)fread与fwrite详解
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)jQuery 基础
  • . Flume面试题
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • [ C++ ] STL---string类的模拟实现
  • [ NOI 2001 ] 食物链
  • [1] 平面(Plane)图形的生成算法
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AIGC] MySQL存储引擎详解
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BJDCTF 2020]easy_md5