【题目】
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"]
.
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
vector<string> vResult;
vResult.clear();
int len=s.length();
if((0==len)||(0==dict.size()))return vResult;
bool dp[len+1];
vector<vector<string> >strArr;
strArr.clear();
memset(dp,false,sizeof(dp));
for(int i=0;i<=len;++i){
vector<string> v;
v.clear();
strArr.push_back(v);
}
dp[len]=true;
for(int i=(len-1);i>=0;--i){
vector<string> vec;
vec.clear();
for(unordered_set<string>::iterator it=dict.begin();it!=dict.end();++it){
int size=(*it).length();
if(((i+size)<=len)&&dp[i+size]&&((*it)==s.substr(i,size))){
dp[i]=true;
if((i+size)==len){
vec.push_back(*it);
continue;
}
if(strArr[i+size].size()>0){
for(int j=0;j<strArr[i+size].size();++j){
if(strArr[i+size][j]!="")vec.push_back((*it)+" "+strArr[i+size][j]);
}
}
}
}
if(vec.size()>0)strArr[i]=vec;
}
vResult=strArr[0];
return vResult;
}
};
【总结】
1.使用动态规划,和word break题一样,区别是要这次要记录下中间结果,以备需要时取。这里使用vector<vector<string> >保存。
2.思路是:从后往前扫描目标字符串s,记录下每个位置dp[i]值,如果s[i...len]可以用dict中的词表达,值为TRUE,否则为FALSE;同时vector<vector<string> >保存s[i...len]能用dict的单词表达的方式。扫描到s首字母的结果就是题目所需。