vector<string> wordBreak(string s, unordered_set<string>& wordDict) { const int n = s.length(); size_t max_len = 0; for (const auto& str: wordDict) { max_len = max(max_len, str.length()); } vector<bool> canBreak(n + 1, false); vector<vector<bool>> valid(n, vector<bool>(n, false)); canBreak[0] = true; for (int i = 1; i <= n; ++i) { for (int l = 1; l <= max_len && i - l >= 0; ++l) { if (canBreak[i - l] && wordDict.count(s.substr(i - l, l))) { valid[i - l][i - 1] = true; canBreak[i] = true; } } } vector<string> result, path; if (canBreak[n]) { wordBreakHelper(s, valid, 0, &path, &result); } return result; }
vector<string> WordBreakII::wordBreak(string s, unordered_set<string> &wordDict) { vector<string> result; vector<string> cur; vector<bool> canBreak(s.size() + 1, true); backtrack(s, wordDict, 0, cur, canBreak, result); return result; }
bool wordBreak(string s, unordered_set<string>& wordDict) { const int n = s.length(); size_t max_len = 0; for (const auto& str: wordDict) { max_len = max(max_len, str.length()); } vector<bool> canBreak(n + 1, false); canBreak[0] = true; for (int i = 1; i <= n; ++i) { for (int l = 1; l <= max_len && i - l >= 0; ++l) { if (canBreak[i - l] && wordDict.count(s.substr(i - l, l))) { canBreak[i] = true; break; } } } return canBreak[n]; }
vector<string> wordBreak(string s, unordered_set<string>& wordDict) { vector<string> result; string ret = ""; if (s == "") { return result; } //use dp to pruning int len = s.length(); vector<bool> canBreak(len + 1, false); canBreak[0] = true; for (int i = 0; i < len; i ++) { for (int j = i; j >= 0; j --) { if (wordDict.count(s.substr(j, i - j + 1)) && canBreak[j]) { canBreak[i + 1] = true; break; } } } if (!canBreak[len]) { return result; } dfs(ret, 0, s, result, wordDict); return result; }