1、题目
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
链接:https://leetcode-cn.com/problems/word-break/
2、思路分析
动态规划
- 先将 wordDict 中的字符串保存在 unordered_set 中,这样查找字符串快
- 开辟 bool 数组,将 dp[0] 设置为 true
- 开始遍历,切割字符串s,在word_set中找,是否匹配
- 匹配则将 dp[i] 修改为true
3、代码展示
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> word_set;
for(auto & word : wordDict)
{
word_set.insert(word);
}
int len = s.size();
vector<bool> dp(len + 1);
dp[0] = true;
for(int i = 1; i <= len; ++i)
{
for(int j = 0; j < i; ++j)
{
if(dp[j] && word_set.find(s.substr(j, i - j)) != word_set.end())
{
dp[i] = true;
break;
}
}
}
return dp[len];
}
};