直接递归求解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; };