高頻算法面試題(字符串) leetcode 139. 單詞拆分

leetcode 139. 單詞拆分

給定一個非空字符串 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

在這裏插入圖片描述
相關文章
相關標籤/搜索