LeetCode題練習與總結:單詞拆分--139

一、題目描述

給你一個字符串?s?和一個字符串列表?wordDict?作為字典。如果可以利用字典中出現的一個或多個單詞拼接出?s?則返回?true

注意:不要求字典中出現的單詞全部都使用,并且字典中的單詞可以重復使用。

示例 1:

輸入: s = "leetcode", wordDict = ["leet", "code"]
輸出: true
解釋: 返回 true 因為 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

輸入: s = "applepenapple", wordDict = ["apple", "pen"]
輸出: true
解釋: 返回 true 因為 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。注意,你可以重復使用字典中的單詞。

示例 3:

輸入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
輸出: false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • s?和?wordDict[i]?僅由小寫英文字母組成
  • wordDict?中的所有字符串?互不相同

二、解題思路

1. 初始化動態規劃數組

  • 創建一個布爾數組?dp,長度為?s.length() + 1
  • 將?dp[0]?設置為?true,因為空字符串可以被看作是由空單詞列表拼接而成。

2. 填充動態規劃數組

  • 遍歷字符串?s?的每個可能的結束位置?i,從?1?到?s.length()
  • 對于每個?i,再進行一次內部循環,遍歷所有可能的前一個位置?j,從?0?到?i-1
  • 在內部循環中,檢查?dp[j]?是否為?true,且?s.substring(j, i)?是否在字典?wordDict?中。
  • 如果上述條件成立,說明從?j?到?i?的子串可以被字典中的單詞拼接而成,因此將?dp[i]?設置為?true

3. 返回結果

  • 動態規劃數組填充完畢后,dp[s.length()]?的值即為所求,它表示整個字符串?s?是否可以被字典中的單詞拼接而成。
  • 返回?dp[s.length()]?作為函數的輸出。

這個動態規劃解法的核心思想是將大問題分解為小問題,通過檢查所有可能的前綴來逐步構建出整個字符串是否可以被拼接的答案。

三、具體代碼

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordSet = new HashSet<>(wordDict);boolean[] dp = new boolean[s.length() + 1];dp[0] = true;for (int i = 1; i <= s.length(); i++) {for (int j = 0; j < i; j++) {if (dp[j] && wordSet.contains(s.substring(j, i))) {dp[i] = true;break;}}}return dp[s.length()];}
}

四、時間復雜度和空間復雜度

1. 時間復雜度
  • 將列表?wordDict?轉換為哈希集合?wordSet?的時間復雜度是 O(k),其中 k 是字典中單詞的數量。這是因為需要對每個單詞進行哈希運算。
  • 初始化布爾數組?dp?的時間復雜度是 O(n),其中 n 是字符串?s?的長度。
  • 雙層循環的時間復雜度是 O(n^2),因為外層循環執行了 n 次,內層循環在最壞情況下也可能執行 n 次。
  • substring?操作的時間復雜度是 O(k),其中 k 是子字符串的長度。在最壞情況下,k 可以達到 n,但通常情況下,k 會有一個上限,即字典中最長單詞的長度。

綜上所述,總的時間復雜度是 O(n^2 * m),其中 m 是字典中單詞的平均長度。這是因為對于每個子字符串,我們需要檢查它是否在字典中,這個操作的時間復雜度是 O(m)。

2. 空間復雜度
  • 哈希集合?wordSet?的空間復雜度是 O(k),其中 k 是字典中單詞的數量。
  • 布爾數組?dp?的空間復雜度是 O(n),其中 n 是字符串?s?的長度。

因此,總的空間復雜度是 O(n + k),即由動態規劃數組和哈希集合構成的空間需求。

五、總結知識點

  1. 動態規劃:這是一種算法設計技術,用于解決優化問題。它將問題分解為更小的子問題,并通過組合子問題的解來解決原始問題。在這個問題中,dp?數組用于存儲子問題的解,即字符串的前綴是否可以被字典中的單詞拼接而成。

  2. 哈希集合HashSet?是 Java 中的一個集合實現,用于存儲不重復的元素,并且可以快速判斷一個元素是否存在于集合中。在這個問題中,wordSet?用于存儲字典中的單詞,以便快速檢查一個子字符串是否是字典中的單詞。

  3. 字符串操作substring?方法是 Java?String?類的一個方法,用于提取字符串中的一個子串。在這個問題中,它用于提取從位置?j?到?i?的子字符串,檢查它是否在字典中。

  4. 數組的初始化:代碼中使用?new boolean[s.length() + 1]?初始化了一個布爾數組?dp,所有元素默認為?false。然后,dp[0]?被顯式設置為?true,因為空字符串可以被看作是由空單詞列表拼接而成。

  5. 雙層循環:外層循環遍歷字符串?s?的每個可能的結束位置?i,內層循環遍歷所有可能的前一個位置?j。這種結構用于填充動態規劃數組?dp

  6. 遞推關系:動態規劃的核心是找到子問題之間的遞推關系。在這個問題中,dp[i]?的值取決于?dp[j]j < i)的值和子字符串?s.substring(j, i)?是否在字典中。

  7. 邊界條件:在動態規劃中,通常需要設置邊界條件。在這個問題中,dp[0]?被設置為?true,這是遞推的起始條件。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

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

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

相關文章

vant組件 頂部下拉刷新和頁面底部下拉獲取數據+頂部搜索框

1.html部分&#xff08;頂部tab切換無&#xff0c;只有主體list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"請輸入搜索關鍵詞"search"…

JavaEE之HTTP協議(1)_HTTP基礎知識,HTTP 請求、響應格式,方法,狀態碼

一、HTTP協議 1.1 基本概念: HTTP全稱超文本傳輸協議&#xff0c;是一種無狀態的、應用層的協議&#xff0c;它基于請求/響應模型。客戶端&#xff08;通常是Web瀏覽器&#xff09;通過發送HTTP請求到服務器來獲取或發送信息&#xff0c;服務器則返回HTTP響應作為回應。HTTP協…

shell (三)shell腳本

SHELL腳本 編程語言的分類 解釋型語言&#xff1a;shell&#xff0c;Python&#xff0c;需要解析器 編譯型語言&#xff1a;C語言&#xff0c;C&#xff0c;需要編譯器 shell腳本 操作系統的結構 shell&#xff08;貝殼&#xff09; 應用層 app&#xff0c;代碼 應用層需要通…

2024年軟件測試面試題大全【答案+文檔】

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、面試基礎題 簡述測試流程&#xff1a; 1、閱讀相關技術文檔&#xff08;如產品PRD、UI設計…

1、線性回歸模型

1、主要解決問題類型 1.1 預測分析(Prediction) 線性回歸可以用來預測一個變量(通常稱為因變量或響應變量)的值,基于一個或多個輸入變量(自變量或預測變量)。例如,根據房屋的面積、位置等因素預測房價。 1.2 異常檢測(Outlier Detection) 線性回歸可以幫助識別數…

鴻蒙開發系統基礎能力:【@ohos.systemTime (設置系統時間)】

設置系統時間 本模塊用來設置、獲取當前系統時間&#xff0c;設置、獲取當前系統日期和設置、獲取當前系統時區。 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import systemTime …

沙盒在數據防泄密領域意義

在信息化快速發展的今天&#xff0c;數據已成為企業最寶貴的資產之一。然而&#xff0c;數據泄密事件頻發&#xff0c;給企業的安全和發展帶來了巨大威脅。SDC沙盒防泄密系統&#xff0c;作為一種創新的數據防泄密解決方案&#xff0c;正逐漸在數據防泄密領域發揮著越來越重要的…

理解和使用JavaScript的閉包

閉包 在前端開發中&#xff0c;JavaScript是一種非常重要的編程語言。它的靈活性和強大功能使得開發者可以創建豐富的用戶體驗。然而&#xff0c;JavaScript中有些概念對于初學者來說可能比較難以理解&#xff0c;閉包就是其中之一。本文將深入探討JavaScript中的閉包&#xf…

安裝zabbix時報錯Could not resolve host: mirrors.huaweicloud.com;Unknown error解決辦法

目錄 1、問題原因 2、解決辦法 3、知識拓展 DNS的區別 DNS配置文件解析 域名解析過程 4、書籍推薦 當安裝Zabbix server&#xff0c;Web前端&#xff0c;agent時出現&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安裝過程中會出…

Python3極簡教程(一小時學完)上

開始 Python 之旅 本教程基于 Python for you and me 教程翻譯制作&#xff0c;其中參考了 Python tutorial 和 _The Python Standard Library_&#xff0c;并對原教程的內容進行了改進與補充。 相關鏈接地址如下&#xff1a; _Python tutorial_&#xff1a;Python 入門指南…

數字孿生流域:定義、組成等

數字孿生流域&#xff1a;定義、組成等 1 數字孿生流域&#xff08;Digital Twin Basin/Watershed&#xff09;總則1.1 定義1.2 適用范圍1.3 建設目標1.4 建設原則 2 數字孿生流域框架與組成2.1 數字孿生流域框架2.2 數字孿生流域組成2.2.1 數字孿生平臺2.2.2 信息化基礎設施 3…

類的裝飾器

1 使用類定義裝飾器 class Person(object):def __init__(self):self._age 0propertydef age(self):return self._ageage.setterdef age(self,newValue):print(觸發了嗎)self._age newValuep Person() print(p.age) # 0 p.age 20 print(p.age) # 20 2 類屬性 class Pe…

JavaScript學習筆記(二)

12、數字 常規用法和java的用法相似&#xff0c;就不再做詳細的記錄, JavaScript 數字 以下只記錄特殊用法&#xff1a; 12.1 數字字符串運算 在所有數字運算中&#xff0c;JavaScript 會嘗試將字符串轉換為數字&#xff1a; var x "100"; var y "10"…

探索QCS6490目標檢測AI應用開發(一):Yolov8n模型轉換及量化

目標檢測&#xff08;Object Detection&#xff09;是計算機視覺領域的核心任務之一&#xff0c;它旨在識別圖像中的物體并確定其位置&#xff0c;在本期的文章中&#xff0c;我們用一個端到端的目標檢測AI應用為例子。介紹如何在QCS6490 Ubuntu系統上實現一個目標檢測應用開發…

第 5 章理解 ScrollView 并構建 Carousel UI

通過上一章的學習,我相信你現在應該明白如何使用堆棧構建復雜的 UI。當然,在你掌握 SwiftUI 之前,你還需要大量的練習。因此,在深入研究 ScrollView 以使視圖可滾動之前,讓我們先以一個挑戰開始本章。你的任務是創建一個類似于圖 1 所示的卡片視圖。 …

如何遷移R包

遷移R包涉及將一個或多個R包從一個系統轉移到另一個系統。以下是遷移R包的詳細步驟&#xff1a; 1. 確定要遷移的R包 首先&#xff0c;列出你在當前系統中安裝的所有R包&#xff0c;或僅列出你需要遷移的R包。你可以使用以下代碼列出所有安裝的R包&#xff1a; installed_pa…

swp添加池子addLiquidity失敗

案發現場 首次添加交易對、一直失敗、但是也沒提示具體的原因。到這一步就沒了、由下圖可知、也沒看到log、由此可見第一步就失敗了。 解決方案 一、添加 工廠KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…

移植對話框MFC

VC版 MFC程序對話框資源移植 以下均拷貝自上面&#xff0c;僅用來記錄 &#xff08;部分有刪除&#xff09; 法1&#xff1a; Eg&#xff1a;將B工程調試好的對話框移植到A工程中 1.資源移植 1.1 在2017打開B工程,在工作區Resource標簽頁中選中Dialog文件夾下的資源文件,按…

注意!短視頻的致命誤區,云微客教你避開!

為什么你做短視頻就是干不過同行&#xff1f;因為你總想著拍劇情、段子這些娛樂視頻&#xff0c;還想著當網紅做IP人設&#xff0c;但是這些內容跟你的盈利沒有半毛錢關系&#xff0c;況且難度大、見效慢&#xff0c;還不是精準客戶。 以上這些就代表你走進了短視頻的誤區&…

C++初學者指南-2.輸入和輸出---流輸入和輸出

C初學者指南-2.輸入和輸出—流輸入和輸出 文章目錄 C初學者指南-2.輸入和輸出---流輸入和輸出1.定制輸入/輸出1.1 示例&#xff1a;點坐標輸入/輸出1.2 流操作符1.3&#xff08;一部分&#xff09;標準庫流類型 2. 工具2.1 用getline讀取行 2.2 用ignore進行跳轉2.3 格式化操作…