給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,在字串中增加空格來構建乙個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。
說明:
示例 1:
輸入:
s = "catsanddog"
worddict = ["cat", "cats", "and", "sand", "dog"]
輸出:[
"cats and dog",
"cat sand dog"
]
示例 2:
輸入:
輸出:[
]解釋: 注意你可以重複使用字典中的單詞。
示例 3:
輸入:
s = "catsandog"
worddict = ["cats", "dog", "sand", "and", "cat"]
輸出:
首先使用動態規劃的方式求出在字串的什麼地方拆分字串為單詞
從字串的最後乙個字元開始比較
假設mid[i]
表示從i
開始到字串最後能否拆分為單詞,如果可以,mid[i]
為true
,否則為false
那麼當判斷mid[i-1]
的時候,取數j
,mid[i-1]
為true
的條件就是從i-1
到i-1+j
這之間所有字元組成的單詞能在worddict
中找到,並且mid[i+j]
的值同時為true
,將所有滿足這個條件的j
找到,並且將i+j
儲存到二維陣列midres
中
那麼midres[i]
的值是乙個陣列,裡面的值就是從i
開始,一直到字串的最後,能夠完美拆分為單詞的前提下,從i
,到下一次分割(也就是下一次插入空格的地方)
然後使用回溯法找出所有可能分割情況
使用遞迴recursion(i int,tmp0 byte)
當遞迴到字串的最後,遞迴結束
對midres[i]
中的每乙個值index
,在index
的地方插入空格
再次呼叫遞迴函式recursion(index int,tmp byte)
func wordbreak(s string, worddict string) string )
for _, word := range worddict {}
} midindexs := make(int, len(s)+1)
midres := make(bool, len(s)+1)
midres[len(s)] = true
for i := len(s) - 1; i >= 0; i--
} }res := string{}
if midres[0]
for _, index := range midindexs[outer]
recursion(index, midstr)
}} recursion(0, byte{})
} return res
}
leetcode 140單詞拆分
原想法 通過遍歷找出每個位點可能出現的單詞的列表,然後通過dfs遍歷找出所有的組合,有點類似於之前刷pat時用的dijstra dfs,如下 class solution else if cursor length 先通過迴圈搜尋出所有開始點可能出現的單詞 for int i 0 i全是a的那個點執...
LeetCode140 單詞拆分II
leetcode140.單詞拆分ii 動態規劃 dfs 回溯。動態規劃 根據139單詞拆分使用動態規劃dp j i 表示從s j.i 1 是可拆分的,可以理解為長度len的字串有len 1可以分割的位置。dfs 遞迴的遍歷當前字串,vectorpath用來記錄能夠拆分的一條路徑。回溯 同一分支的多種...
LeetCode 140 單詞拆分 II
問題描述 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,在字串中增加空格來構建乙個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。說明 示例 1 輸入 s catsanddog worddict cat cats and sand dog 輸出 cats and...