![](https://img-blog.csdnimg.cn/img_convert/bc4191fdbd94f09fc718915699a98689.png)
题目来源:
今天刷题刷到单词拆分,第一眼给我的感觉有点像动态规划经典例题背包问题,将字典相当于物品,背包相当于字符串s,并且字典中的单词可以重复使用。定义dp[i]表示s中前i个字符是否可以在字典中找到,遍历分割点j(j<i)。当s[0,j-1]和s[j,i-j]两个字符串都能在字典中找到,则dp[i]=true。边界条件dp[0]=true。
对应字符串搜索,可以使用unordered_set 容器,unordered_set中有个find()方法,查找指定元素,
找到元素返回元素的迭代器,没有找到则返回指向unordered_set::end()的迭代器。
核心代码:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> set1(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 s1 = s.substr(j,i-j);
if(set1.find(s1)!=set1.end()&&dp[j]){
dp[i]=true;
break;
}
}
}
return dp[s.size()];
}
};
unordered_set 容器的使用请参考:
(75条消息) C++常用语法——unordered_set_unordered_set 头文件_还没想好~的博客-CSDN博客