【滑动窗口】-30. 串联所有单词的子串

leetcode官网给的题解跟shit一样!!!

官网题解:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/
我写的比官网好理解
官网的题解看不明白,可以参考我的代码。

题目

  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”] 顺序排列的连接。

简简单单 有手就行:

我的代码逻辑很简单,很容易理解,但是超时了!!!,这时间复杂度也没有多大呀,如果有大神可以帮我优化的话,留言,不胜感激!

    public List<Integer> findSubstring(String s, String[] words) {ArrayList<Integer> result = new ArrayList<>();List<String> list2 = Arrays.asList(words);ArrayList<String> list = new ArrayList<>(list2); //对list进行操作for (int left = 0, right = left+words[0].length() ; right <= s.length() ;left ++,right = left+words[0].length()) {if(right>s.length()) break;//当前考虑的元素String current = s.substring(left,right);int l = left,r = right;while(list.contains(current)){list.remove(current);if (list.size()==0){ //符合条件result.add(left);break;}l = l+words[0].length();r = r+words[0].length();if(r>s.length()) break;current = s.substring(l,r);}list =  new ArrayList<>(list2); //恢复list 准备下一轮}return result;}

看题解,shit,不过还是有一点启发

比官网的题解好理解太多了

public List<Integer> findSubstring(String s, String[] words) {ArrayList<Integer> result = new ArrayList<>();HashMap<String, Integer> map = new HashMap<>(); //k:单词,v:单词出现次数for (String word : words) {map.put(word, map.getOrDefault(word, 0) + 1); //增加单词出现次数}HashMap<String, Integer> map2 = new HashMap<>();  //用map2进行操作map2.putAll(map);//处理字符串s left每次后移一位,获取left和right之间的子串for (int left = 0, right = left+(words[0].length()*words.length) ; right <= s.length() ;left ++,right = left+(words[0].length()*words.length)) {if(right>s.length()) break;//获取子串String current = s.substring(left,right);String s1 = String.join("", words); //字符串数组 转 字符串if(current.equals(s1)){result.add(left);continue;}//处理子串for (int l=0,r = l+words[0].length();r<=current.length();l=l+words[0].length(),r = r+words[0].length()){String word = current.substring(l, r);map2.put(word, map2.getOrDefault(word, 0) - 1); //减少单词出现次数if (map2.get(word) == 0) {map2.remove(word);}}if (map2.isEmpty()) {result.add(left);}map2.clear();map2.putAll(map); //恢复map2中的值 准备下一轮}return result;}

收获

没想到HashMap还有一个这样的方法:

map.getOrDefault(key, default_value);

应用:

map.put(word, map.getOrDefault(word, 0) + 1); //value++
map.put(word, map.getOrDefault(word, 0) - 1); //value–

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

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

相关文章

【学习笔记】TLS/SSL握手之Records

TLS / SSL会话是由记录&#xff08;Records&#xff09;所组成&#xff0c;有4种records HandshakeAlertChange Cipher SpecApplication DataHandshake和Alert Records被分为子类型&#xff08;Subtypes&#xff09;&#xff1a; Handshake&#xff1a;Client HelloHandshake&a…

Dubbo 如何使用 Zookeeper 作为注册中心:原理、优势与实现详解

Dubbo 是一个高性能的 Java 分布式服务框架&#xff0c;而 Zookeeper 常被用作 Dubbo 的服务注册中心。Zookeeper 提供了分布式一致性和协调服务&#xff0c;Dubbo 通过 Zookeeper 实现服务注册与发现功能&#xff0c;确保在分布式环境下服务实例的动态管理和可靠发现。 下面是…

主数据管理的核心价值是什么

主数据在标准化的基础上实现唯一化&#xff0c;通过主数据的唯一性保障在各系统之间基础数据的一致性&#xff0c;并且能够被各系统在交互互数据时直接使用&#xff0c;无需额外维护映射表(字段)和进行翻译等处理&#xff0c;为此主数据必须做到"一实体一编码"&#…

Miniforge详细安装教程(macOs和Windows)

(注&#xff1a;主要是解决商业应用anaconda收费问题&#xff0c;这是轻量级的代替&#xff0c;个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器&#xff0c;类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境&#xff0c;专注于…

Java新手指南:从菜鸟到编程大师的趣味之路-多态

这里是Themberfue 本章讲的是Java三大特性之一的多态&#xff0c;也是最后一个特性 多态概念 既然我们要学习多态&#xff0c;首先得知道这玩意儿到底是个什么东西&#xff1f; 通俗地说&#xff0c;多态其实就是多种形态。具体来说就是去完成某个行为&#xff0c;当不同的对象…

Secret Configmap

应用启动过程中可能需要一些敏感信息&#xff0c;比如访问数据库的用户名&#xff0c;密码或者秘钥&#xff0c;讲这些信息直接保存在容器镜像中显然不合适&#xff0c;kubernetes提供的解决方案就是Secret Secret会以密文的方式存储数据&#xff0c;避免了直接在配置文件中保…

极狐GitLab 17.4 重点功能解读【四】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

tauri开发配置文件和文件夹访问路径问题

文件夹没权限&#xff1a;Unhandled Promise Rejection: path not allowed on the configured scope: /Users/song/Library/Application Support/com.pakeplus.app/assets/default.png 没有文件夹&#xff0c;需要先创建&#xff1a;Unhandled Promise Rejection: path: /Users…

数据结构与算法——Java实现 24.中缀表达式转后缀

目录 中缀表达式转后缀表达式 引言 思路 代码 正因为我有能力跨越&#xff0c;考验才会降临 —— 24.9.28 中缀表达式转后缀表达式 引言 Java中的编译器会将我们编写代码中的中缀表达式转化为后缀表达式&#xff0c;然后编译好输出程序 思路 遍历中缀表达式&#xff0c;如果遇…

javaweb之会话管理

Cookie&#xff1a; 1. Cookie 的定义 Cookie 是存储在用户浏览器中的小块数据&#xff0c;通常由服务器发送并存储&#xff0c;以便在用户浏览器和服务器之间保持会话状态。每次用户发送请求时&#xff0c;浏览器都会自动附带相应的 Cookie&#xff0c;允许服务器辨识用户。…

亚信安慧AntDB基于操作符的隐式转换

背景 在新一代信息技术创新应用的大背景下&#xff0c;为了降低用户使用成本、加快改造速度&#xff0c;很多数据库产品都在做Oracle兼容性适配。AntDB作为一款成熟、稳定的国产数据库&#xff0c;高度兼容Oracle语法。本文将主要介绍AntDB数据库基于操作符的隐式转换及其设计…

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件&#xff0c;做了一简单的uniapp二维码组件&#xff0c;二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持&#xff1a;利用Canvas元素实现二维码的跨浏览器兼容性&#xff0c;兼容微信小程序、h5、app。 无依赖性&#xff1a;QR…

基于SpringBoot的新冠检测信息管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 国内外在该方向的研究现状及分析 新型冠状病毒肺炎疫情发生以来&#xff0c;中国政府采取积极的防控策略和措施&#xff0c;经过两个多月的不懈努力&#xff0c;有效控制了新发病例的増长&#xff0c;本地传播已经趋于完全控制…

spark 大表与大表join时的Shuffle机制和过程

在 Spark 中&#xff0c;当处理大表与大表的 JOIN 操作时&#xff0c;通常会涉及到 Shuffle 机制&#xff0c;这是分布式计算中用于重新分布数据的关键步骤。Shuffle 的本质是将数据按照某种方式重新分组&#xff0c;使得相同 key 的数据能够被发送到同一个计算节点进行后续的操…

PostgreSQL查询库所有表和指定表结构(CLI)

查看所有表 \dt查看表结构 \d <指定表名>

JavaWeb图书借阅系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术&#xff0c;属于 Elastic 技术栈的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索。Logstash/Beats&#xff1a;用于数据收集。Kib…

nodejs 016: javascript语法——解构赋值({ a, b, c } = {})=>{console.log(“Hello“);}

在 JavaScript 中&#xff0c;函数参数 { a, b, c } {} 的含义是在函数定义时提供一个默认的对象参数。这个对象包含了三个可选的属性 a, b, 和 c。如果没有传递参数或者传递的参数是一个非对象类型的值&#xff0c;那么函数内部将使用一个空对象 {} 作为参数。 示例 const …

基于STM32与OpenMV的智能垃圾分类系统:SSD目标检测算法的设计与流程

一、项目概述 随着城市化进程的加快&#xff0c;垃圾分类变得越来越重要。本文设计了一套基于STM32F103单片机、图像处理技术和传感器技术的智能垃圾分类系统。该系统能够自动识别垃圾类型&#xff0c;并通过机械装置进行准确分类&#xff0c;有效提升垃圾分类的效率和准确性。…