题目描述
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s
则返回 true
。
**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
注意,你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
提示:
- 1 <= s.length <= 300
- 1 <= wordDict.length <= 1000
- 1 <= wordDict[i].length <= 20
- s 和 wordDict[i] 仅由小写英文字母组成
- wordDict 中的所有字符串互不相同
代码及注释
go
func wordBreak(s string, wordDict []string) bool {
// 初始化一个 map,用于存储 wordDict 中的单词
wordDictSet := make(map[string]bool)
// 初始化动态规划数组,dp[i] 表示 s 的前 i 个字符是否可以被 wordDict 中的单词拆分
dp := make([]bool, len(s) + 1)
// 将 wordDict 中的单词加入到 wordDictSet 中
for _, w := range wordDict {
wordDictSet[w] = true
}
// 初始化,空字符串可以被拆分
dp[0] = true
// 遍历 s 的每个字符
for i := 1; i <= len(s); i++ {
// 遍历 j,0 ≤ j < i
for j := 0; j < i; j++ {
// 如果 s 的前 j 个字符可以被拆分,并且 s[j:i] 存在于 wordDict 中
if dp[j] && wordDictSet[s[j:i]] {
// 则 s 的前 i 个字符可以被拆分
dp[i] = true
break
}
}
}
// 返回 s 是否可以被完全拆分
return dp[len(s)]
}
代码解释
-
初始化 wordDictSet:
gowordDictSet := make(map[string]bool)
- 创建一个
map
,用于存储wordDict
中的单词,以便于后续快速查找。
- 创建一个
-
初始化动态规划数组 dp:
godp := make([]bool, len(s) + 1)
- 创建一个布尔类型的数组
dp
,其中dp[i]
表示字符串s
的前i
个字符是否可以被wordDict
中的单词拆分。
- 创建一个布尔类型的数组
-
将 wordDict 中的单词加入到 wordDictSet 中:
gofor _, w := range wordDict { wordDictSet[w] = true }
- 遍历
wordDict
,将其中的单词加入到wordDictSet
中,以便后续快速查找。
- 遍历
-
初始化 dp[0] 为 true:
godp[0] = true
- 空字符串可以被拆分,因此
dp[0]
初始化为true
。
- 空字符串可以被拆分,因此
-
动态规划遍历:
gofor i := 1; i <= len(s); i++ { for j := 0; j < i; j++ { if dp[j] && wordDictSet[s[j:i]] { dp[i] = true break } } }
- 使用动态规划的方法遍历字符串
s
的每个字符,对于每个字符i
,从0
到i-1
的字符j
进行遍历。 - 如果
dp[j]
为true
(即字符串s
的前j
个字符可以被拆分),并且s[j:i]
存在于wordDict
中,那么dp[i]
就设置为true
。 - 使用
break
结束内层循环,因为只需要找到一个满足条件的j
即可。
- 使用动态规划的方法遍历字符串
-
返回结果:
goreturn dp[len(s)]
- 返回
dp[len(s)]
,表示整个字符串s
是否可以被完全拆分为wordDict
中的单词。
- 返回