动态规划——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 @ 2025-01-19 15:54  NeroMegumi  阅读(24)  评论(0)    收藏  举报