一:题目
二:上码
class Solution {
public:
/**
思路:1.分析题意
单词就是物品;
字符串就是背包;
单词能否组成字符串就是在问,物品能不能将背包装满
单词可以重复使用那么说明这是一个完全背包
2.动态规划五步走
1>:确定dp数组的与下标的含义(这里用下标i是由我们的遍历顺序决定的)
dp[i] 表示的是 字符串长度为i的话 dp[i] = true;
长度为i的字符串是可以拆分为一个或者多个在字典中出现的单词
2>:确定dp状态转移公式
如果dp[j]是true的话 那么在[j,i]这个区间我们截取的字符串是出现在字典中的,那么dp[i]一定是true
0-j是true的话 也就是字符串前面的字符出现在字典中,然后我们后面截取的字符串[i,j]也在
字典中,那么我们就可以确定dp[i] = true 也就是长度为i的字符串一定出现在字典中
3>:确定dp数组的初始化
我们应该确定其该开始的时候都为false,因为我们还未开始查找
但是我们的dp[0]一定要为true 因为我们在计算的时候是需要前面的dp[j]=true的 否则将都会是false
4>:确定dp数组的遍历顺序
外层遍历背包;内层遍历物品
5>:
*/
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> ans(wordDict.begin(),wordDict.end());
vector<bool> dp(s.size()+1,false);
dp[0] = true;
for(int i = 0; i <= s.size(); i++) {//遍历字符串也就是背包
for(int j = 0; j < i; j++) {//遍历物品
string str = s.substr(j,i-j);//从j开始 由i-j个字符
if(ans.find(str) != ans.end() && dp[j] == true) dp[i] = true;
}
}
return dp[s.size()];
}
};
动态规划做的不少了 换个类型就不会了 我可能是个智障 略略略略略略