动态规划+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();
}
}
}
};