Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
分析:
在Word Break的基础上要求输出路径,因此需要记录当前查到的单词的长度,所以将f 数组由简单的布尔型修改为vector<int>,存放当前字符起始的所有可能的单词长度。
路径生成部分采用深度搜索。
class Solution {
public:
vector<vector<int>> f;
vector<string> res;
void gen_path(string s,string cur,int beg)
{
if(beg==s.size())
{
res.push_back(cur);
return;
}
if(cur.size()>0) cur+=" ";
for(int i=0;i<f[beg].size();++i)
{
string part = s.substr(beg,f[beg][i]);
gen_path(s,cur+part,beg+f[beg][i]);
}
}
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
const int n=s.size();
if(n==0) return res;
f.resize(n);
for(int i=n-1;i>=0;--i)
{
string cur = s.substr(i);
if(wordDict.count(cur)>0)
f[i].push_back(cur.size());
for(int j=1;j<cur.size();++j)
if(wordDict.count(cur.substr(0,j))>0&&f[i+j].size()>0)
f[i].push_back(j);
}
gen_path(s,"",0);
return res;
}
};