046_单词拆分

知识点:动态规划

LeetCode第一百三十九题:https://leetcode-cn.com/problems/word-break/submissions/

难得自己做出了到DP的题目,开心。从超时的解法,优化到0ms,双百。

语言:GoLang

// DP解法,双百,时间复杂度O(nk),n为s的长度,k为单词表中最大长度的单词长度
func wordBreak(s string, wordDict []string) bool {
    sLen := len(s)

    dp := make([]bool, sLen + 1)
    dp[0] = true

    for i := 1; i <= sLen; i++ {
        for _, word := range wordDict {
            wLen := len(word)
            if wLen > i {
                continue
            }

            match := true
            for k := 0; k < wLen; k++ {
                if match = s[i + k - wLen] == word[k]; !match {
                    break
                }
            }

            dp[i] = dp[i] || (match && dp[i - wLen])
        }
    }

    return dp[sLen]
}









// 回溯版 - 超时解法
func wordBreak_(s string, wordDict []string) bool {
    return backtrack(s, wordDict)
}

func backtrack(s string, wordDict []string) bool{
    result := false
    for _, word := range wordDict {
        wLen := len(word)
        
        if len(s) < wLen {
            continue
        }

        i := 0
        for ; i < wLen; i++ {
            if s[i] != word[i] {
                break
            }
        }

        // 检查单词是否能够匹配
        if i < wLen {
            continue
        }

        if len(s) == wLen {
            return true
        }

        result = backtrack(s[wLen:], wordDict)
        // if result {
        //     break
        // }
    }
    return result
}
posted @ 2020-04-04 17:08  Cenyol  阅读(83)  评论(0)    收藏  举报