給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict,斷定 s 是否能夠被空格拆分爲一個或多個在字典中出現的單詞。算法
說明: 拆分時能夠重複使用字典中的單詞。 你能夠假設字典中沒有重複的單詞。數組
輸入: s = "leetcode", wordDict = ["leet", "code"]
輸出: true
解釋: 返回 true 由於 "leetcode" 能夠被拆分紅 "leet code"。
複製代碼
輸入: s = "applepenapple", wordDict = ["apple", "pen"]
輸出: true
解釋: 返回 true 由於 "applepenapple" 能夠被拆分紅 "apple pen apple"。
注意你能夠重複使用字典中的單詞。
複製代碼
輸入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
輸出: false
複製代碼
這道題,咱們考慮用動態規劃的作法。 咱們每次考慮字符串從開始的當前索引位置是否能夠被拆分。若是能夠就記憶化方便下次使用。 走起:app
func wordBreak(s string, wordDict []string) bool {
//首先先把全部的單詞存到Map中,利用hash的O(1)的查找時間複雜度
m := make(map[string]bool, len(wordDict))
for _, v:= range wordDict {
m[v] = true
}
//初始化dp數組
dp := make([]bool, len(s)+1)
dp[0] = true
for i:=1;i<=len(s);i++ {
for j:=0;j<i;j++ {
//每次能夠看前j個元素,和從j到i是否能夠被拆分。
if dp[j] && m[s[j:i]] {
//dp數組中記憶化,方便下輪循環查看(這裏的i表示是當前是第幾個元素,並不是是索引下標)
dp[i] = true
break
}
}
}
//返回dp數組最後一個元素就好
return dp[len(s)]
}
複製代碼
動態規劃是典型的紙老虎,看起來很唬人,可是它是吃草的哦。多玩玩就有感受了。繼續加油。ui
算法夢想家,來跟我一塊兒玩算法,玩音樂,聊聊文學創做,我們一塊兒天馬行空! spa