题目:
思路:
动态规划。用二维数组dp[i][j]保存s[i~j]是否在wordDict。然后用递归的方式进行DFS深度优先遍历,将所有可能的组合都尝试一遍。但是超时了,结果为29 / 36 test cases passed
。
然后学习了https://www.cnblogs.com/reboot329/p/6168346.html之后,发现用一维数组dp(数组大小与字符串长度相同)就可以解决,dp[i]代表s[i+1]及其之后的元素都能匹配成功。我是倒着往前算的,从dp的最后一个元素开始。如果s[i~j]成功匹配,并且dp[j]为true(s[j+1]及其之后的元素可以匹配成功),则dp[i-1]置为true。否则,什么都不用做。继续向前寻找dp为true的元素,重复前述过程。
特殊情况:s为空或wordDict为空,直接返回false即可。
正着算的思路是一样的,只是实现细节不一样而已。
代码实现:
超时的代码:
class Solution {
public:
bool existInSet(string &s, unordered_set<string> &sset){
if (sset.find(s) != sset.end()){
return true;
}
return false;
}
bool f(const string &s, const vector<vector<bool>> &dp, int begin){
if (begin >= s.size()){
return true;
}
for (int i = s.size()-1; i >= begin; --i) {
if (dp[begin][i] == true) {
bool ret = f(s, dp, i + 1);
if (ret == true) {
return ret;
}
}
}
return false;
}
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> sset;
int nums = wordDict.size();
for (int i