LeetCode140.單詞拆分II
阿新 • • 發佈:2018-11-24
動態規劃+DFS+回溯。
動態規劃:根據139單詞拆分使用動態規劃dp[j][i]表示從s[j...i-1]是可拆分的,可以理解為長度len的字串有len+1可以分割的位置。
DFS:遞迴的遍歷當前字串,vector<stirng> path用來記錄能夠拆分的一條路徑。
回溯:同一分支的多種情況,path.push_back(); dfs(); path.pop_back()。
class Solution { public: vector<string> path; vector<string> res; vector<string> wordBreak(string s, vector<string>& wordDict) { vector<bool> f(s.size() + 1, false); f[0] = true; int len = s.size(); vector<vector<bool>> dp(len + 1, vector<bool>(len + 1, false)); for (int i = 1; i <= len; i++) { for (int j = i - 1; j >= 0; --j) { if (f[j] && find(wordDict.begin(), wordDict.end(), s.substr(j, i - j)) != wordDict.end()) { f[i] = true; dp[j][i] = true; } } } getpath(s, dp, len, len); return res; } void getpath(string& s, vector<vector<bool>>& dp, int len, int cur) { if (cur == 0) { string tmp; for (auto it = path.crbegin(); it != path.crend(); ++it) { tmp += *it; tmp += " "; } tmp.erase(tmp.end() - 1); res.push_back(tmp); } for (int i = 0; i <= len; ++i) { if (dp[i][cur]) { path.push_back(s.substr(i, cur - i)); getpath(s, dp, len, i); path.pop_back(); } } } };