Leetcode 串聯所有單詞的子串

在這里插入圖片描述

算法思想(中文解釋)

這道題目要求我們在字符串 s 中找到所有子串,這些子串是字符串數組 words 中所有單詞的串聯,并且每個單詞只能使用一次,且順序可以任意。下面是代碼的算法思想:


1. 核心思路

分解問題

  • 因為每個單詞長度相同,我們可以使用一個滑動窗口(Sliding Window)來檢查所有可能的子串。
  • 判斷一個子串是否是所有單詞的串聯,可以通過比較單詞的頻次。

2. 步驟講解

(1)初始化:
  • 單詞長度:用 wordLength 表示 words 中每個單詞的長度(因為題目保證它們長度相同)。
  • 總串聯長度totalLength = wordLength * words.length,因為子串的長度一定是所有單詞的長度之和。
  • 構造單詞頻次表:用 wordMap 記錄 words 中每個單詞的出現次數,便于后續比較。
(2)滑動窗口遍歷:
  • 從字符串 s 的每個位置開始,以長度為 totalLength 的窗口進行檢查:
    • 提取窗口中的子串 sub
    • 檢查這個子串是否包含了 words 中所有單詞且頻次正確。
(3)子串驗證:
  • 對于窗口中的子串 sub,將其按照 wordLength 分割成一個個小單詞。
  • 檢查這些小單詞是否在 wordMap 中,并驗證它們的出現頻次是否超出限制:
    • 如果某個單詞不在 wordMap 中,立即返回 false
    • 如果某個單詞出現的次數超過了在 wordMap 中的次數,也返回 false
  • 如果所有單詞驗證通過,則說明當前窗口位置是符合要求的,記錄下起始索引。

3. 時間復雜度分析

  1. 構造單詞頻次表O(m),其中 mwords 的長度(即單詞個數)。
  2. 滑動窗口遍歷:外層遍歷最多需要 n - totalLength + 1 次,n 是字符串 s 的長度。
  3. 驗證子串:每次驗證需要遍歷窗口中的所有單詞,復雜度為 O(m * wordLength)

因此,總復雜度為
[ O((n - totalLength + 1) \cdot m \cdot wordLength) ]
通常可以簡化為 O(n * m),適用于 s 較長和 words 較短的場景。


4. 代碼邏輯解釋

主函數:
  1. wordMap:統計 words 中每個單詞的出現頻次。
  2. 滑動窗口遍歷:通過 for 循環,遍歷從 0 到 s.length() - totalLength 的所有可能起始位置。
  3. 子串驗證:調用輔助函數 isValid() 檢查是否符合要求。
輔助函數 isValid
  1. 將子串 sub 分割成長度為 wordLength 的小單詞。
  2. 使用 seen 哈希表記錄窗口內每個單詞的頻次。
  3. wordMap 進行比較,判斷是否匹配。

5. 關鍵優化點

  1. 滑動窗口:避免暴力檢查所有子串,只檢查可能的窗口,減少不必要的計算。
  2. 哈希表:使用 wordMapseen 快速判斷頻次關系,而不是逐一比較。
  3. 提前退出:在驗證過程中,一旦發現不匹配的單詞,立即退出驗證,避免冗余計算。

6. 適用場景

該算法非常適用于以下情況:

  • 單詞長度固定,字符串較長。
  • words 中的單詞個數適中(否則頻次表的維護開銷較大)。

通過滑動窗口和哈希表的結合,這個算法能夠高效解決題目要求。

java solution

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> result = new ArrayList<>();if(s == null || s.length() == 0 || words.length == 0 || words == null) return result;//初始化輔助變量int wordsLength = words.length;int wordLength = words[0].length();int totalLength = wordLength * wordsLength;//創建頻率統計哈希表Map<String, Integer> freq = new HashMap<>();for(String word:words) {freq.put(word, freq.getOrDefault(word, 0) + 1);}//變量字符串sfor(int i = 0; i <= s.length() - totalLength; i++) {//首先獲取窗口內的子串String sub = s.substring(i, i + totalLength); //substring 是左閉右開//然后驗證此時窗口內的子串if(isValid(sub, freq, wordLength)) {result.add(i);}}return result;}private boolean isValid(String sub, Map<String, Integer> freq, int wordLength) {Map<String, Integer> seen = new HashMap<>(); //存儲子串中的單詞頻次for(int j = 0; j < sub.length(); j += wordLength) {//提取子串中的單詞String word = sub.substring(j, j + wordLength);if(!freq.containsKey(word)) { //如果這個單詞不在freq頻率表中,return false;}seen.put(word, seen.getOrDefault(word, 0) + 1); //更新seen中的頻次if(seen.get(word) > freq.get(word)) { //如果頻次超過freq的限制return false; }}return true;}
}

182 個測試用例通過了 181 個,被全 a 的測試用例卡住了(超時),

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

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

相關文章

解析在OceanBase創建分區的常見問題|OceanBase 用戶問題精粹

在《分區策略和管理分區計劃的實踐方案》這篇文章中&#xff0c;我們介紹了在ODC中制定分區策略及有效管理分區計劃的經驗。有不少用戶在該帖下提出了使用中的問題&#xff0c;其中一個關于創建分區的限制條件的問題&#xff0c;也是很多用戶遭遇的老問題。因此本文以其為切入&…

有哪些免費的 ERP 軟件可供選擇?哪些 ERP 軟件使用體驗較好?

想找個 “免費” 的 ERP 軟件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及財務、人力、供應鏈、采購、銷售等好多方面的重要企業軟件。功能這么全&#xff0c;能免費才怪呢&#xff01;真要是有免費的&#xff0c;早就火遍大江南北&#xff0c;說不定把市場都壟斷了&…

centos-stream9系統安裝docker

如果之前安裝過docker需要刪除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安裝yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

了解cuda的統一內存

1. CUDA 6中的統一內存 在CUDA 6中&#xff0c;從Kepler GPU架構&#xff08;計算能力3.0或更高&#xff09;開始&#xff0c;在64位Windows 7、8和Linux操作系統&#xff08;內核2.6.18&#xff09;上開始支持統一內存. 從CUDA 6開始&#xff0c;NVIDIA推出了CUDA平臺歷史上…

unity 最小后監聽鍵盤輸入

當Untiy最小化后&#xff0c;游戲窗口不會立刻失去焦點&#xff0c;此時依然可以使用Input來獲取按鍵&#xff0c;但是點擊其他窗口后&#xff0c;就會失去焦點&#xff0c;此時系統會把按鍵輸入分配到其他窗口里&#xff0c;此時要用windowsAPI獲取按鍵輸入&#xff0c;應對兩…

Pytorch | 從零構建MobileNet對CIFAR10進行分類

Pytorch | 從零構建MobileNet對CIFAR10進行分類 CIFAR10數據集MobileNet設計理念網絡結構技術優勢應用領域 MobileNet結構代碼詳解結構代碼代碼詳解DepthwiseSeparableConv 類初始化方法前向傳播 forward 方法 MobileNet 類初始化方法前向傳播 forward 方法 訓練過程和測試結果…

Electronjs+Vue如何開發PC桌面客戶端(Windows,Mac,Linux)

electronjs官網 https://www.electronjs.org/zh/ Electron開發PC桌面客戶端的技術選型非常適合已經有web前端開發人員的團隊。能夠很絲滑的過渡。 Electron是什么&#xff1f; Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.…

【1.排序】

排序 筆記記錄 1.排序的基本概念1.1 排序的定義 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希爾排序 3. 交換排序3.1 冒泡排序3.2 快速排序 4. 選擇排序4.1 簡單選擇排序4.2 堆排序 5. 歸并排序、基數排序和計數排序5.1 歸并排序4.2 基數排序4.3 計數排序 6. 各種內部排…

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目錄 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap&#xff1f;主要命令介紹1. mkswap2. mkfs.swap3. swapon 創建和管理 Swap 的步驟1. 創建 Swap 分區2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 狀態 刪除 Swap 分區或文件1. 停用 Swap2. 刪…

取子串(指針)

#include <stdio.h> #include <string.h>char* substr(char *s, int startloc, int len) {static char result[51]; // 定義一個足夠大的靜態數組來存儲結果static char result1[] {N,U,L,L,\0};int i, j;// 檢查startloc是否在字符串的范圍內if (startloc < 1…

「Mac暢玩鴻蒙與硬件45」UI互動應用篇22 - 評分統計工具

本篇將帶你實現一個評分統計工具&#xff0c;用戶可以對多個選項進行評分。應用會實時更新每個選項的評分結果&#xff0c;并統計平均分。這一功能適合用于問卷調查或評分統計的場景。 關鍵詞 UI互動應用評分統計狀態管理數據處理多目標評分 一、功能說明 評分統計工具允許用…

類與對象的理解

面向對象中兩個重要的概念&#xff1a;類與對象 類 簡單理解&#xff0c;它指的是類型或者分類或某個模塊 比如&#xff1a;人類、動物類……&#xff1b;入公司的入職單&#xff0c;沒寫上任何人的情況下 對象 簡單理解&#xff0c;它指的具體的個體 備注&#xff1a;對…

遞歸實現指數型枚舉(遞歸)

92. 遞歸實現指數型枚舉 - AcWing題庫 每個數有選和不選兩種情況 我們把每個數看成每層&#xff0c;可以畫出一個遞歸搜索樹 葉子節點就是我們的答案 很容易寫出每dfs函數 dfs傳入一個u表示層數 當層數大于我們n時&#xff0c;去判斷每個數字的選擇情況&#xff0c;輸出被選…

Linux相關概念和易錯知識點(25)(信號原理、操作系統的原理、volatile)

目錄 1.信號的產生 &#xff08;1&#xff09;kill &#xff08;2&#xff09;raise、abort 2.對block、pending、handler表的管理 &#xff08;1&#xff09;信號集&#xff08;sigset_t&#xff09; &#xff08;2&#xff09;block表的管理 ①操作相關的函數 ②sigpr…

opencv中的色彩空間及其轉換

在 OpenCV 中&#xff0c;色彩空間&#xff08;Color Space&#xff09;指的是表示顏色的一種方式&#xff0c;或是用數學模型對顏色的表達。不同的色彩空間采用不同的方式來描述顏色的三要素&#xff08;如亮度、飽和度、色調&#xff09;&#xff0c;因此可以在不同的應用場景…

OPPO 數據分析面試題及參考答案

如何設計共享單車數據庫的各個字段? 對于共享單車的數據庫設計,首先考慮用戶相關的字段。用戶表可以包含用戶 ID,這是一個唯一標識符,用于區分不同用戶;姓名,記錄用戶的真實姓名;聯系方式,比如手機號碼,方便在出現問題時聯系用戶;注冊時間,記錄用戶何時開始使用共享…

在Ubuntu下運行QEMU仿真FreeBSD riscv64系統

在Ubuntu下運行QEMU仿真FreeBSD riscv64系統 突發奇想&#xff0c;嘗試在Ubuntu下運行QEMU仿真FreeBSD riscv64系統&#xff0c; 參考這篇文檔&#xff1a;手把手教你在QEMU上運行RISC-V Linux_qemu 運行 .bin-CSDN博客 并參考FreeBSD的Wiki&#xff1a;riscv - FreeBSD Wik…

大模型微調---Prompt-tuning微調

目錄 一、前言二、Prompt-tuning實戰2.1、下載模型到本地2.2、加載模型與數據集2.3、處理數據2.4、Prompt-tuning微調2.5、訓練參數配置2.6、開始訓練 三、模型評估四、完整訓練代碼 一、前言 Prompt-tuning通過修改輸入文本的提示&#xff08;Prompt&#xff09;來引導模型生…

Visual Studio 、 MSBuild 、 Roslyn 、 .NET Runtime、SDK Tools之間的關系

1. Visual Studio Visual Studio 是一個集成開發環境&#xff08;IDE&#xff09;&#xff0c;為開發者提供代碼編寫、調試、測試和發布等功能。它內置了 MSBuild、Roslyn 和 SDK Tools&#xff0c;并提供圖形化界面來方便開發者進行項目管理和構建。與其他組件的關系&#xf…

Winnows基礎(2)

Target 了解常見端口及服務&#xff0c;熟練cmd命令&#xff0c;編寫簡單的 .bat 病毒程序。 Trail 常見服務及端口 80 web 80-89 可能是web 443 ssl心臟滴血漏洞以及一些web漏洞測試 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主機管理系統登陸&#xff08;國外用的…