直接递归求解TLE(Time Limit Exceeded),
用vector<vector<string>> ret(s.size()+1)保存wordBreak的解MLE(Memory Limit Exceeded),
采用DP+DFS通过测试。
在LeetCode 139. Word Break的中,用dp[i]标识s.substr(0, i)是否可以由dict里的字符串组成;
在此我们用dp[i]标识s.substr(0, i)的workBreak解的最后一个单词的集合。
如输入["abcdefg", {"a", "bc", "abc" ,"ab", "c"}]
那么dp[3] = ["bc", "abc", "c"].
所以我们可以根据dp[now]获得这个集合,
考察集合中的特定元素str, 则可以通过now - str.size()去推算str的前继字符串,进行dfs求解。
代码:
class Solution
{
public:
vector<string> wordBreak(string s, unordered_set<string> &dict)
{
vector<vector<string>> dp(s.size()+1);
dp[0].push_back(string(""));
for (size_t i = 0; i < s.size(); ++ i)
{
if (dp[0].empty() == true)
{
continue;
}
for (size_t length = 1; i + length <= s.size(); ++ length)
{
if (dict.find(s.substr(i, length)) == dict.end())
{
continue;
}
dp[i + length].push_back(s.substr(i, length));
}
}
dfs(string(), dp, s.size());
return ret;
}
private:
void dfs(string str, vector<vector<string>>& dp, size_t now)
{
if (now == 0)
{
ret.push_back(str);
return ;
}
for (auto it = dp[now].begin(); it != dp[now].end(); ++ it)
{
string new_str = (str.empty()? *it: *it + " " + str);
dfs(new_str, dp, now - it->size());
}
}
vector<string> ret;
};