这道题用代码随想录的解释有点牵强,第二层for循环和递推公式也没有说明白。
代码
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]才为truedp[i] = true;}}}return dp[size];}
};