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
}