代码随想录|day46|动态规划part08● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

总链接:第九章 动态规划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;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值