前言
LeetCode题目:LeetCode 139
Takeaway:背包问题——完全背包问题,内外循环的顺序很重要,决定了是求排列还是求组合。
以及字符串处理。内层循环不一定直接是物品,也可以是用来取物品的变量。
一、139
内层循环不一定直接是物品,也可以是用来取物品的变量,如本题的 j - i
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
// 定义DP数组,DP数组含义是:当前位置能否被单词构成
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
//排列问题,外重量,内物品, (i是新的单词的起始位置,j是新的单词的结束位置)
for(int j=1; j<=s.size(); j++){
for(int i=0; i<j; i++){
//需要添加的单词长什么样(word)
string word = s.substr(i, j - i); //substr(起始位置,截取的个数)
//能不能在wordDict中找到这个word,如果找到了就将DP[j]置为 1,表示能构成
if (wordSet.find(word) != wordSet.end() && dp[i]) {
dp[j] = true;
}
}
}
return dp[s.size()];
}
};
总结
完全背包结束,多重背包其实拆开就是01背包。