心得:
第一题、unordered_set中 find() 和 end() 的用法。
第一题、单词拆分 LeetCode 139 https://leetcode.cn/problems/word-break/
dp数组:dp[i] 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。
递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。
初始化: dp[0]肯定要是true,否则递推公式都是错的了
遍历顺序:完全背包,求排列数,所以是先背包后物品
注意:这里要 记住的是unordered_set的用法:
unordered_set成员方法
成员方法 功能
find(key) 查找值为key的元素,如果找到,则返回一个指向该元素的正向迭代器;如果没找到,则返回一个与end()方法相同的迭代器
end() 返回指向容器中最后一个元素之后位置的迭代器
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
for(int i = 1; i <= s.size(); i++){//先背包
for(int j = 0; j < i; j++){
string word = s.substr(j, i - j); substr(起始位置,截取的个数)
if(wordSet.find(word) != wordSet.end() && dp[j] == true)
dp[i] = true;
}
}
return dp[s.size()];
}
};