【代码随想录】刷题笔记Day46
发布时间:2024年01月05日
前言
- 刚考完自辩,Chat回答举例什么的真方便。早上做组会PPT去了,火速来刷题!
- 单词是物品,字符串s是背包,单词能否组成字符串s,就是问物品能不能把背包装满
- 能重复用,是完全背包,其实也就是双指针的思想,i从头到尾,j从0到i
- dp[i]含义
- 从头开始字符串长度为i,dp[i]为true表示可以拆分为在字典中出现的单词
- 递推公式
- if( [j, i] 这个区间的子串出现在字典里 && dp[j]==true)? dp[i] = true
- 初始化
- 遍历顺序
- 讲究顺序,用完全背包排列数的顺序,先背包后物品(双指针)
-
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
for (int i = 1; i <= s.size(); i++) { // 遍历背包
for (int j = 0; j < i; j++) { // 遍历物品(其实是子串的开始下标)
string word = s.substr(j, i - j); //substr(起始位置,截取的个数)
if (wordSet.find(word) != wordSet.end() && dp[j]) {
dp[i] = true;
}
}
}
return dp[s.size()];
}
};
多重背包理论基础
?背包问题总结
?后言
- 背包问题终于结束啦,感觉这几道顺下来还是有点眉目的,只要把思路理清楚其实代码啪啪啪就可以打出来了(主要是因为比较简短,要考虑的特殊情况不多),今天是周五!下班!!
文章来源:https://blog.csdn.net/qq_56077562/article/details/135411761
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!