总链接:第九章 动态规划part08
139.单词拆分
链接:代码随想录
救命,回溯法全部忘光了
大概看了一下,全部想错了呢
这是我一开始的判断,认为是个组合的完全背包问题:
代码随想录得解释:
这道题比较复杂的是dp的i和j,与s.substr中s的index,不是一个东西,相差1,相差的1就是dp[0]空字符串。
代码一开始写的但报错:
class Solution { /* 这道题也是完全背包??真是让人大吃一惊 字典中的单词可以重复使用-------完全背包 不要求字典中出现的单词全部都使用----每个物品可以是0.。。n个。 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。 但是是有顺序的,即排列问题,先遍历背包,再遍历物品 如若dp[i]=true,j>i,只有dp[i]=true && s.substr(i,j -i+1)在wordDict中,dp[j]==true; s[0] s[1] "" l le lee leet leetc leetco leetcod leetcode "leet" t f f f t f "code" f f f f f f f t 1、确定dp数组以及下标的含义 &&2、动态规划递推关系 i<j dp[j] 是否可以利用字典中出现的单词拼接出 s(index=[0,j-1])。 条件:if(dp[i]==true && uset.find(s.substr(i,j-i))!=uset.end()) { dp[j]=true; } 3、推导举例 4、初始值 dp[0]=true;//组成空串 5、遍历顺序 排列问题,先背包再物品 多重背包,二层循环从小到大遍历 */ public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string>uset( wordDict.begin(), wordDict.end()); /*for(auto p:uset) { cout<<p<<endl; }*/ vector<bool>dp(s.size()+1,false); dp[0]=true; for(int j=1;j<=s.size();j++)//先遍历背包容量 { for(int i=0;i<wordDict.size();i++)//再遍历物品 { if(dp[i]==true && uset.find(s.substr(i,j-i))!=uset.end()) { dp[j]=true; } } } return dp[s.size()]; return true; } };
后来改成代码随想录的答案(i<j)正确了,不知道为啥。
class Solution { /* 这道题也是完全背包??真是让人大吃一惊 字典中的单词可以重复使用-------完全背包 不要求字典中出现的单词全部都使用----每个物品可以是0.。。n个。 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。 但是是有顺序的,即排列问题,先遍历背包,再遍历物品 如若dp[i]=true,j>i,只有dp[i]=true && s.substr(i,j -i+1)在wordDict中,dp[j]==true; s[0] s[1] "" l le lee leet leetc leetco leetcod leetcode "leet" t f f f t f "code" f f f f f f f t 1、确定dp数组以及下标的含义 &&2、动态规划递推关系 i<j dp[j] 是否可以利用字典中出现的单词拼接出 s(index=[0,j-1])。 条件:if(dp[i]==true && uset.find(s.substr(i,j-i))!=uset.end()) { dp[j]=true; } 3、推导举例 4、初始值 dp[0]=true;//组成空串 5、遍历顺序 排列问题,先背包再物品 多重背包,二层循环从小到大遍历 */ public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string>uset( wordDict.begin(), wordDict.end()); /*for(auto p:uset) { cout<<p<<endl; }*/ 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++)//再遍历物品 { if(dp[i]==true && uset.find(s.substr(i,j-i))!=uset.end()) { dp[j]=true; } } } return dp[s.size()]; return true; } };