使用二位bool数组来标记前驱的办法会超时,用vector<int>的数组既节省空间,又节省时间。
另一个需要注意的地方是在寻找i的前驱节点j时,在 Word Break I找到一个j可以直接break,而此处需要找到所有的j。
在DFS的过程中,path传值即可。此处如果用引用,需要退栈(删除最后一个word),反而会更加麻烦。
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
const int n = s.size();
vector<int> table[n+1];
for(int i=1; i<=n; i++)
for(int j=i-1; j>=0; j--)
if(dict.find(s.substr(j, i-j)) != dict.end() && (j==0 || table[j].size()))
table[i].push_back(j);
vector<string> result;
if(table[n].size() == 0)
return result;
dfs(table, s, "", result, n);
return result;
}
void dfs(vector<int> table[], string &s, string path, vector<string> &result, int cur)
{
if(cur == 0)
{
path.erase(path.size()-1);
result.push_back(path);
return;
}
for(int i=0; i<table[cur].size(); i++)
{
string word = s.substr(table[cur][i], cur-table[cur][i]);
dfs(table, s, word + " " + path, result, table[cur][i]);
}
}
};