LeeCode题库:139. 单词拆分
动态规划思想:
当一个大问题里包含小问题时,为避免重新计算小问题,可以将之前问题的答案进行记录,计算大问题时便可以跳过小问题计算直接调用小问题答案。
本题应用:
大问题:这个字符串是否由单词组成
小问题:前i位是否由字符串组成
递归关系:如果这个字符串能由单词组成,则0至a1-1是一个单词,0至a2-1是两个单词……0至字符串尾是n个单词。首先找到第一个条件成立的所有为止,从这些位置后一位找下一个单词即可找到第二个条件成立的所有位置,直至确认最后一个条件是否成立。
代码:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordDictSet;
for (auto word: wordDict) {
wordDictSet.insert(word);
}
auto dp = vector <bool> (s.size() + 1);
dp[0] = true;
for (int i = 1; i <= s.size(); ++i) {
for (int j = 0; j < i; ++j) {
if (dp[j] && wordDictSet.find(s.substr(j, i - j)) != wordDictSet.end()) {
dp[i] = true;
break;
}
}
}
return dp[s.size()];
}
};