您的位置:首页 > 其它

Leetcode--Word Break II

2014-10-06 11:19 573 查看
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
[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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: