这道题用代码随想录的解释有点牵强,第二层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]才为true
dp[i] = true;
}
}
}
return dp[size];
}
};
标签:26,set,int,单词,拆分,wordDict,dp,size
From: https://www.cnblogs.com/neromegumi/p/18679636