- 字符串—>背包 单词—>物品
- 单词可以重复使用 -->完全背包 —>正序
- 只考虑能不能组成—>true/false–>无顺序要求–>for循环顺序不重要
(1)dp[i] 第i个 字符结尾的字符串是否能够被拼接
(2) dp[i] = dp[i-n]; 如果 有一个单词能够以第i个字符结尾拼接上,能否完全拼接就要看之前的能够成功
(3)初始化 dp[0] = true
(4)注意事项 字符串截取 s.substr(pos, len)
如果一个位置已经证明为true 不必再进行更新,下一个单词不合适 这个地方会变成false
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool>dp(s.size()+1, false);
dp[0] = true;
for(int i=1; i<s.size()+1; i++){
for(int j=0; j<wordDict.size(); j++){
int n = wordDict[j].size();
if(i >= n){
if(!dp[i] && s.substr((i-n), n) == wordDict[j]){
dp[i] = dp[i-n];
}
}
}
}
return dp[s.size()];
}
};