1. 程式人生 > >LeetCode140.單詞拆分II

LeetCode140.單詞拆分II

LeetCode140.單詞拆分II

動態規劃+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();
			}
		}
	}
};