持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 18 天,点击查看活动详情
题目链接
题目描述
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
测试用例
用例1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
限制
- 1 <= s.length <= 300
- 1 <= wordDict.length <= 1000
- 1 <= wordDict[i].length <= 20
- s 和 wordDict[i] 仅有小写英文字母组成
- wordDict 中的所有字符串 互不相同
题目分析
题目会给定一个列表,让我们尝试使用列表中单词,来拼接出指定的字符串 s,如果能就返回 true,否则返回 false
这道题可以使用动态规划的思路来处理,但是,他的状态转移方程有点特殊,假定我们有一个可以确认够由词典构成的前缀字符串 s1,如果词典中存在某个单词 c1, 即前缀 s2 可以有现有的前缀 s1 + c1 构成,用个不太恰当的方程来表示: f(n) = s + f(m)
采用 DP 打表的思路,我们从 i = 0,即 f(0) = '' 开始,每次都遍历词典,如果存在单词满足条件 arr[i] + str == s.slice(0, i + str.length),我们可以将 DP 表中下标为 i + str.length 的数据标记为 arr[i] + str,表示 [0, i + str.length] 这个区间的字符串可以由词典的单词构成
遍历完成后,我们只需要检查 DP 表的最后一项,如果不为 '' 则表明存在一种拼接的方案得到指定的字符串 s
代码实现
完整的代码实现如下
var wordBreak = function (s, wordDict) {
let arr = new Array(s.length + 1).fill('')
for (let i = 0; i < s.length; i++) {
for (let j = 0; j < wordDict.length; j++) {
let str = wordDict[j];
if (arr[i] + str == s.slice(0, i + str.length)) {
arr[i + str.length] = arr[i] + str;
}
}
}
return arr[s.length] == '' ? false : true;
};