@代码随想录算法训练营第46天 | 动态规划 完全背包 LeetCode139.单词拆分, 多重背包理论
139.单词拆分
第一遍读题思考
没想法。
代码随想录解法思路
回溯和动规都可以做,但是回溯会超时,需要一个memory去进行剪枝。
动规的话就是dp数组表示s[0]到s[j]这个字符串可以被拆分,它为true的条件显然是用一个i遍历0-j,然后dp[i]为true的同时i-j这个字符串也能在wordset里找到。
c++代码具体实现注意事项
注意这个必须先遍历背包再遍历物品,因为必须是有序的排列
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
std::unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
vector<bool> dp(s.size()+1, false);
dp[0] = true;
for(int j=1;j<=s.size();j++)
for(int i=0;i<j;i++)
{
string word = s.substr(i, j-i);
if(wordSet.find(word)!=wordSet.end() && dp[i]){
dp[j] = true;
// continue;
}
}
return dp[s.size()];
}
};
多重背包
当作01背包来做