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();
			}
		}
	}
};

猜你喜欢

转载自blog.csdn.net/Gentlemanman/article/details/84196338
今日推荐