前往
大廳
主題

LeetCode - 139. Word Break 解題心得

Not In My Back Yard | 2022-07-04 12:00:05 | 巴幣 0 | 人氣 475

題目連結:


題目意譯:
給定一字串 s 以及一個字串之字典 wordDict,回傳真(True)如果 s 可以分解成一個或多個字典中的字詞,其間以空白隔開。

注意到在一個字串分解中,字典中同一個字詞可以使用複數次。

限制:
1 ≦ s.length ≦ 300
1 ≦ wordDict.length ≦ 1000
1 ≦ wordDict[i].length ≦ 20
s 和 wordDict[i] 只由小寫英文字母組成。
wordDict 中所有字串皆相異。



範例測資:
範例 1:
輸入: s = "leetcode", wordDict = ["leet","code"]
輸出: true
解釋: 回傳真,因為 "leetcode" 可以被分解成 "leet code"。

範例 2:
輸入: s = "applepenapple", wordDict = ["apple","pen"]
輸出: true
解釋: 回傳真,因為 "applepenapple" 可以被分成 "apple pen apple"。
注意到你可以多次使用一個字典中的字詞。

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


解題思維:
首先把 wordDict 中的字串丟進雜湊表(Hash Table)中,以方便快速查詢一個字串是否存在於 wordDict 中。

接著定義 s[i, j] 為字串 s 中第 i 個字元 ~第 j 個字元所形成的子字串,以及 D[i] 代表 s 的前 i 個字元是否可以被分解成題目所求的若干個字典中的字詞(因此我們的所求即為 D[s.length])。

此時我們可以列出遞迴式:
D[0] = true,這邊預設其可以被分解成題目所求的樣子(儘管根本沒有字詞被分出來,因為此時是空字串);
D[i] = D[x1] or D[x2] or……,其中 i > 0 且 x1 、x2、……等等之 xj 值滿足 0 ≦ xj < i 且 s[xj, i - 1] 存在於 wordDict 中,而「or」代表邏輯「或」之運算,即 D[x1] 、 D[x2] 等等其中一個為真則 D[i] 為真。
也就是說我們試圖從當前字串結尾擷取一個在 wordDict 中的字詞,然後看看剩下的可不可以也被分解成功。如果存在一組可行,則代表 D[i] 為真(也就是可以被分解);反之,則代表 D[i] 為假。

因此我們從 D[1] 開始便可以一路推到 D[s.length],此即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作