思路
- dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]
- 递推公式:
tmp = s.substr(j - wordDict[i].size(), wordDict[i].size());
dp[j] = (dp[j - wordDict[i].size()] && wordDict[i] == tmp) || dp[j];
- dp数组初始化:dp[0] = true;
- 遍历顺序:由于算是排列问题,不同字典语句先后会影响判断,所以先遍历背包再遍历物品,当前容量在前一个容量完成了对所有物品遍历一遍
- 时间复杂度:
代码
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(s.size() + 1, false);dp[0] = true;for (int j = 1; j <= s.size(); j++) {for (int i = 0; i < wordDict.size(); i++) {if (j >= wordDict[i].size()) {string tmp;tmp = s.substr(j - wordDict[i].size(), wordDict[i].size());dp[j] = (dp[j - wordDict[i].size()] && wordDict[i] == tmp) || dp[j];}}}return dp[s.size()];}
};