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 就是我們的結果了。

整理完畢,完結撒花~ 🌻

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160220.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flutter的Event Loop

Flutter 的事件循環機制是其框架的核心部分&#xff0c;它負責管理事件的處理和UI的渲染。了解這個機制對于開發高效且響應迅速的Flutter應用非常重要。以下是Flutter事件循環的主要組成部分和工作原理&#xff1a; 1. 主事件循環&#xff08;Main Event Loop&#xff09; 當…

利用ros實現單片機通訊(轉載)

我覺得如果使用這個人的micro_ros通信協議&#xff0c;就不用再去Ubuntu或者Windows上面自己寫驅動程序了&#xff0c; 利用micro_ros實現esp32與ros2的通訊 Tianci ? 天津大學 工學博士 參考&#xff1a;https://github.com/micro-ROS/micro_ros_arduino https://blog.cs…

B站app作品列表sign

之前寫過一篇pc的:B站pc端w_rid逆向 最近pc端老是作妖,更新的太頻繁了, 于是決定干一下app, pc端有個w_rid加密,app端也有個類似的sign 人狠話不多,直接上成果吧: # -*- coding: UTF-8 -*- import hashlib import time import requests import json from urllib.parse…

C語言好好題(一維數組)

兩天沒有更新了&#xff0c;貼紙們&#xff0c;有沒有想我呀。&#x1f604;&#x1f604;&#x1f604; 好了&#xff0c;就寒暄到這里吧&#xff0c;下面請看題&#xff1a; 有序序列判斷 輸入一個整數序列&#xff0c;判斷是否是有序序列&#xff0c;有序&#xff0c;指序列…

騰訊云輕量4核8G12M帶寬服務器租用價格和S5實例報價

騰訊云4核8G服務器優惠價格表&#xff0c;云服務器CVM標準型S5實例4核8G配置價格15個月1437.3元&#xff0c;5年6490.44元&#xff0c;輕量應用服務器4核8G12M帶寬一年446元、529元15個月&#xff0c;阿騰云atengyun.com分享騰訊云4核8G服務器詳細配置、優惠價格及限制條件&…

C++(模板進階)

目錄 前言&#xff1a; 本章學習目標&#xff1a; 1.非類型模版參數 1.1使用方法 1.2注意事項 1.3 實際引用 2.模版特化 2.1概念 2.2函數模板特化 2.3類模板特化 2.3.1全特化 2.3.2偏特化 3.模版分離編譯 ?編輯 3.1失敗原因 ?編輯 3.2解決方案 4 總結 前言&…

【C++】類和對象——構造函數和析構函數

今天要學習兩個特殊的函數&#xff0c;分別是構造函數和析構函數&#xff0c;它們究竟有什么用呢&#xff1f; 比如說&#xff0c;我們先寫一個簡單的日期的類 class Date { public:void Init() {_year 1;_month 1;_day 1;}void Print() {cout << _year << &qu…

Sentinel 分布式系統

Sentinel 是一種分布式系統的流量防衛兵和熔斷器&#xff0c;由阿里巴巴開發并開源。它的主要目標是保護分布式系統中的穩定性和可用性&#xff0c;防止因高并發或異常流量而導致的系統崩潰。下面是 Sentinel 的原理和使用教程的概要&#xff1a; Sentinel 的原理&#xff1a;…

如何去開發一個springboot starter

如何去開發一個springboot starter 我們在平時用 Java 開發的時候&#xff0c;在 pom.xml 文件中引入一個依賴就可以很方便的使用了&#xff0c;但是你們知道這是如何實現的嗎。 現在我們就來解決這一個問題&#xff01; 創建 SpringBoot 項目 首先我們要做的就是把你想要給別…

css3

基礎 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>style</title><!-- link&#xff08;外部樣式&#xff09;和style&#xff08;內部樣式&#xff09;優先級相同&#xff0c;重復寫會覆蓋 --><link re…

面試題-9

1.如何封裝一個組件 1.使用Vue.extend()創建一個組件 2.使用Vue.components()方法注冊組件 3.如果子組件需要數據,可以在props中接收定義 4.子組件修改好數據,要把數據傳遞給父組件&#xff0c;可以用emit()方法 原則: 把功能拆開 盡量讓組件原子化,一個組件做一件事情 …

centos7安裝MySQL—以MySQL5.7.30為例

centos7安裝MySQL—以MySQL5.7.30為例 本文以MySQL5.7.30為例。 官網下載 進入MySQL官網&#xff1a;https://www.mysql.com/ 點擊DOWNLOADS 點擊鏈接&#xff1b; 點擊如上鏈接&#xff1a; 選擇對應版本&#xff1a; 點擊下載。 安裝 將下載后的安裝包上傳到/usr/local下…

CTF靶場搭建及Web賽題制作與終端docker環境部署

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 寫在前面 ╔═══════════════════════════════════════════════════…

使用ChatGPT創建Makefile構建系統:使用Make運行Docker

使用ChatGPT創建Makefile構建系統&#xff1a;使用Make運行Docker 芯語芯愿&#xff08;知乎/紛傳/CSDN/&#xff09;&#xff1b;小石頭的芯語芯愿&#xff08;微信公眾號&#xff09; 開發高效現代的構建系統對于滿足開發周期需求至關重要。原先&#xff0c;嵌入式開發者一…

Unity 場景烘培 ——LensFlare鏡頭光暈(三)

提示&#xff1a;文章有錯誤的地方&#xff0c;還望諸位大神指出&#xff01; 文章目錄 前言一、鏡頭光暈 (Lens Flares)是什么&#xff1f;二、使用Lens Flares組件總結 前言 一般情況下都會忽略的東西&#xff0c;鏡頭光暈。理論上不加鏡頭光暈&#xff0c;也不會有什么影響…

vue3的兩個提示[Vue warn]: 關于組件渲染和函數外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 這個消息是提示我們&#xff0c;需要將引入的方法作為一個變量使用。以vue-store為例&#xff0c;如果我們按照如下的方式使用&#xff1a; import UseUserStore from ../../store/module…

數據治理之考評環節

考評的流程&#xff08;批處理&#xff09; 周期調度&#xff0c;每天一次&#xff1a;采集hive, hdfs元數據存放到mysql中的dga庫的metainfo表手動通過管理頁面補充輔助信息指標考評 讀取要考評的表的元數據及輔助信息讀取要考評的指標對每張表的每個指標逐個進行考評保存考評…

RabbitMQ快速入門(簡單收發消息)

文章目錄 前言一、數據隔離1.用戶管理2.virtual host 二、控制臺收發1.交換機2.隊列3.綁定 三、編程式收發1.依賴和配置2.收發信息 總結 前言 1.了解數據隔離 2.RabbitMQ控制臺收發信息 3.SpringBoot整合RabbitMQ收發信息 一、數據隔離 1.用戶管理 點擊Admin選項卡&#xff0…