完全背包算法
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
一、题目描述
给定一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出字符串 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
二、测试样例
2.1 样例一
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true,因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
2.2 样例二
输入: s = "leetcodeleet", wordDict = ["leet", "code"]
输出: true
解释: 返回 true,因为 "leetcodeleet" 可以由 "leet"、"code"、“leet” 拼接而成,“leet” 使用了两次。
三、算法思路
本题是典型的钱币兑换问题,用完全背包可以解决。
字符串 s 看做容量,单词看做物品,判断物品是否能够正好装满背包。
dp[i] 表示字符串s[0, i] 是否能够正好通过单词拼装。那么,状态转移方程如下所示:
dp[i] = { dp[j] && wordDict.contains(s[j, i-1]) } (0 <= j < i)
四、代码实现
五、复杂度分析
5.1 时间复杂度
时间复杂度为:O(n^2),这里 n 指的是字符串 s 的长度,两层 for 循环,故时间复杂度为 O(n^2)。
5.2 空间复杂度
空间复杂度为:O(n),使用到了一个 dp 数组,长度为 n,使用到了一个 set 集合,综合后空间复杂度为 O(n)。
六、总结
本题重点是在题意理解上,理解后转化为完全背包问题来解决。
CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
- 点赞
- 收藏
- 关注作者
评论(0)