动态规划——26单词拆分

这道题用代码随想录的解释有点牵强,第二层for循环和递推公式也没有说明白。
image
image

代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> set(wordDict.begin(),wordDict.end());
        //字典单词是物品,s是背包
        int size = s.size();
        int num = wordDict.size();
        // 初始化 1.全为false 2.dp[0]空串为true才能递推
        vector<bool> dp(size+1);//dp[i]表示字符串的前i个字符组成的字符串是否可由wordDict的单词拼出
        dp[0] = true;
        
        // 遍历顺序:先容量再物品——求排列数(字典单词按顺序排列才能组成s)
        for(int i=1;i<=size;i++){// 容量
            for(int j=0;j<i;j++){// 物品
                // 递推公式
                // 要看[0-i-1]是否合法,可以将其分割为[0-j-1],[j,i-1]两个部分,前者由dp[j]得,后者看是否在字典中; 其中j < i
                // 第一部分[0-j-1]由dp[j]可知
                string str = s.substr(j,i-j);// 第二部分[j,i-1]:起始位置j,截取个数i-j(总共是i个字符)
                if(dp[j] && set.find(str)!=set.end()){//dp[i]==true && [i,j]在字典中 dp[j]才为true
                    dp[i] = true;
                }
            }
        }

        return dp[size];

    }
};
posted @   NeroMegumi  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示