力扣-单词拆分
目录
🔗 题目链接
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。请你判断是否可以利用字典中出现的单词拼接出 s
。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入:s =
输出:true
解释:返回 true 因为
"leetcode", wordDict = ["leet", "code"]
输出:true
解释:返回 true 因为
"leetcode"
可以由 "leet"
和 "code"
拼接成。
示例 2:
输入:s =
输出:true
解释:返回 true 因为
"applepenapple", wordDict = ["apple", "pen"]
输出:true
解释:返回 true 因为
"applepenapple"
可以由 "apple" "pen" "apple"
拼接成。注意,你可以重复使用字典中的单词。
示例 3:
输入:s =
输出:false
"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
中的所有字符串互不相同
动态规划+记忆化回溯 逐行解释 python31
动态规划
- 初始化 $dp=[False,⋯,False]$,长度为 $n+1$。$n$ 为字符串长度。$dp[i]$ 表示 $s$ 的前 $i$ 位是否可以用 $wordDict$ 中的单词表示。
- 初始化 $dp[0]=True$,空字符可以被表示。
- 遍历字符串的所有子串,遍历开始索引 $i$,遍历区间 $[0,n)$:
- 遍历结束索引 $j$,遍历区间 $[i+1,n+1)$:
- 若 $dp[i]=True$ 且 $s[i,⋯,j)$ 在 $wordlistword$ 中:$dp[j]=True$。解释:$dp[i]=True$ 说明 $s$ 的前 $i$ 位可以用 $wordDict$ 表示,则 $s[i,⋯,j)$ 出现在 $wordDict$ 中,说明 $s$ 的前 $j$ 位可以表示。
- 遍历结束索引 $j$,遍历区间 $[i+1,n+1)$:
- 返回 $dp[n]$
代码
|
|
复杂度分析
- 时间复杂度:$O(n^{2})$
- 空间复杂度:$O(n)$