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"]
思路:类似于求解NP问题的回溯法,res[i][j]=true表示字符串的i到j位在字典中
class Solution {
public:
int len;
bool **res;
string ss;
vector<string> v;
void traceback(int n,string str)
{
if(n>=len)
{
v.push_back(str);
return ;
}
else{
for(int i=n;i<len;i++)
{
if(res[n][i])
{
string st=str+ss.substr(n,i-n+1);
traceback(i+1,st);
}
}
}
}
vector<string> wordBreak(string s, unordered_set<string> &dict) {
ss=s;
len=s.size();
res=new bool*[len];
for(int i=0;i<s.size();i++){
res[i]=new bool[len];
for(int j=0;j<len;j++)
res[i][j]=false;
}
for(int i=0;i<s.size();i++)
{
for(int j=i;j<s.size();j++)
{
if(dict.count(s.substr(i,j-i+1))>0)
{
res[i][j]=true;
}
}
}
string str="";
traceback(0,str);
return v;
}
};
Submission Result: Time Limit Exceeded
下面参考一段代码来自:https://oj.leetcode.com/discuss/133/is-there-better-solution-for-this-word-breakii
class Solution {
public:
void collect(vector<list<int>>& mark, int ind, const string& s,
string path, vector<string>& result){
for(auto&stop: mark[ind]){
string sub=s.substr(ind,stop-ind);
string newpath=path+(ind==0?sub:" "+sub);
if(stop==s.length()) result.push_back(newpath);
else collect(mark,stop,s,newpath,result);
}
}
vector<string> wordBreak(string s, unordered_set<string> &dict) {
vector<list<int>> mark(s.length(),list<int>());
for(int stop=s.length();stop>=0;stop--){
if(stop<s.length()&&mark[stop].empty())continue;
for(int start=stop-1;start>=0;start--)
if(dict.count(s.substr(start,stop-start)))
mark[start].push_back(stop);
}
vector<string> result;
collect(mark,0,s,"",result);
return result;
}
};
void collect(vector<list<int>>& mark, int ind, const string& s, string path, vector<string>& result)
{
for(list<int>::iterator it=mark[ind].begin();it!=mark[ind].end();it++)
{
string sub=s.substr(ind,*it-ind);
string newpath=path+(ind==0?sub:" "+sub);
if(*it==s.length())
result.push_back(newpath);
else
collect(mark,*it,s,newpath,result);
}
}