题目
思路
使用动态规划求解该题目。dp[i]
记录s[0 : i]
是否匹配字典中的单词(即能够通过空格划分为多个字典中单词的组合)。求解dp[i]
时,我们假设已经求得所有dp[j], j < i
,并尝试从s[0:i]
的尾部匹配一个词典中的单词(如下图所示)。匹配的方法为遍历词典中的所有单词(词典中不同长度的单词对于不同的j
),尝试找到同s[j + 1 : i]
匹配的单词。如果找到这样的单词,并且此时dp[j] = true
则dp[i] = true
,如果遍历完词典中所有的单词都不满足上述条件,则dp[i] = false
. 最后返回dp
数组最后一个元素即可。
代码
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
bool* dp = new bool[s.size()];
for(int i = 0; i < s.size(); i++) {
dp[i] = false;
for (string w : wordDict) {
if (i + 1 >= w.size() && s.substr(i + 1 - w.size(), w.size()) == w ) {
if (i + 1 - w.size() > 0) {
dp[i] = dp[i - w.size()];
} else {
dp[i] = true;
}
if (dp[i] == true) {
break;
}
}
}
}
return dp[s.size() - 1];
}
};