文章目录
一、139.单词拆分
本题要注意以下几点:
1)先遍历背包再遍历物品,因为正确的单词拆分是强调顺序的,apple+pen+apple是正确的,而apple+apple+pen是错误的;
2)dp[0]不对应字符,是人为加上去的。题目中明确了是非空字符串s,测试数据中不会出现i为0的情况,因此dp[0]初始化为true是为了推导递推公式;
3)遍历背包时,i从1开始。dp[1]对应第一个字符,dp[s.size()]对应最后一个字符。
代码如下:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set wordSet(wordDict.begin(), wordDict.end());
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
for (int i = 1; i <= s.size(); i++) { // 先遍历背包(排序)dp从1开始(0已经定义过了,dp[0]是多加的)dp[1]才是对应第一个字符,dp[s.size()]对应最后一个字符
for (int j = 0; j < i; j++) {
string word = s.substr(j, i - j); // 截取j+1到i的字符子串
if (wordSet.find(word) != wordSet.end() && dp[j] == true) {
dp[i] = true;
}
}
}
return dp[s.size()];
}
};