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-breakI
class Solution {
public:
bool wordBreak(string s, unordered_set<string> &dict) {
int len = s.size();
if(s.size() == 0) return false;
vector<bool> dp(len + 1, false);
dp[len] = true;
for(int i = len - 1; i >= 0; i--)
{
for(int j = i; j < len; j++)
{
string substr = s.substr(i, j - i + 1);
if(dict.find(substr) != dict.end() && dp[j+1] == true)
{
dp[i] = true;
break;
}
}
}
return dp[0];
}
};
//DFS 复杂度过大
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict)
{
string str;
vector<string> res;
fun (s, dict, res, 0, str);
return res;
}
void fun (string &s, unordered_set<string> &dict, vector<string> &res, int start, string &str)
{
for (int i=start+1;i<=s.size();i++)
{
string tmp = s.substr(start, i-start);
if (dict.find(tmp) != dict.end())
{
string tmp1 = str;
str += tmp;
str += " ";
if (start + tmp.size() == s.size())
res.push_back(str);
else
fun (s, dict, res, start + tmp.size(), str, flag);
str = tmp1;
}
}
}
};
//DFS 优化 复杂度过大
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict)
{
string str;
vector<string> res;
vector<vector<bool> > flag (s.size()+1, vector<bool> (s.size(), false));
for(int i=0;i<s.size();i++)
{
for (int j=i;j<s.size();j++)
{
string tmp = s.substr(i, j-i+1);
if (dict.find(tmp) != dict.end())
flag[i][j] = true;
}
}
fun (s, dict, res, 0, str, flag);
return res;
}
void fun (string &s, unordered_set<string> &dict, vector<string> &res, int start, string &str, vector<vector<bool> > &flag)
{
for (int i=start+1;i<=s.size();i++)
{
string tmp = s.substr(start, i-start);
if (flag[start][i-1])
{
string tmp1 = str;
str += tmp;
str += " ";
if (start + tmp.size() == s.size())
res.push_back(str);
else
fun (s, dict, res, start + tmp.size(), str, flag);
str = tmp1;
}
}
}
};
//直接递归
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
return fun(s,dict);
}
vector<string> fun(string s, unordered_set<string> &dict)
{
vector<string> res;
for (int i=0;i<s.size();i++)
{
string tmp = s.substr(0, i+1);
if (dict.find(tmp) != dict.end())
{
if (i == s.size()-1)
res.push_back(tmp);
else
{
vector<string> vec = fun(s.substr(i+1), dict);
for (int j=0;j<vec.size();j++)
{
res.push_back(tmp);
res.back() += " ";
res.back() += vec[j];
}
}
}
}
return res;
}
};
//递归保存 结果顺序不一样
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict)
{
if (mmap.find(s) != mmap.end())
return mmap[s];
vector<string> res;
for (int i=0;i<s.size();i++)
{
string tmp = s.substr(0, i+1);
if (dict.find(tmp) != dict.end())
{
if (i == s.size()-1)
res.push_back(tmp);
else
{
vector<string> vec = wordBreak(s.substr(i+1), dict);
for (int j=0;j<vec.size();j++)
{
res.push_back(tmp);
res.back() += " ";
res.back() += vec[j];
}
}
}
}
mmap.insert(pair<string, vector<string> >(s, res));
return res;
}
map <string, vector<string> > mmap;
};
测试
#include "head.h"
class Solution1 {
public:
bool wordBreak(string s, set<string> &dict) {
int len = s.size();
if(s.size() == 0) return false;
vector<bool> dp(len + 1, false);
dp[len] = true;
for(int i = len - 1; i >= 0; i--)
{
for(int j = i; j < len; j++)
{
string substr = s.substr(i, j - i + 1);
if(dict.find(substr) != dict.end() && dp[j+1] == true)
{
dp[i] = true;
break;
}
}
}
print1Dvectorint(dp);
return dp[0];
}
};
class Solution2 {
public:
vector<string> wordBreak(string s, set<string> &dict)
{
string str;
vector<string> res;
fun (s, dict, res, 0, str);
return res;
}
void fun (string &s, set<string> &dict, vector<string> &res, int start, string &str)
{
for (int i=start+1;i<=s.size();i++)
{
string tmp = s.substr(start, i-start);
if (dict.find(tmp) != dict.end())
{
string tmp1 = str;
str += tmp;
str += " ";
if (start + tmp.size() == s.size())
res.push_back(str);
else
fun (s, dict, res, start + tmp.size(), str);
str = tmp1;
}
}
}
};
class Solution3 {
public:
vector<string> wordBreak(string s, set<string> &dict)
{
string str;
vector<string> res;
vector<vector<bool> > flag (s.size()+1, vector<bool> (s.size(), false));
for(int i=0;i<s.size();i++)
{
for (int j=i;j<s.size();j++)
{
string tmp = s.substr(i, j-i+1);
if (dict.find(tmp) != dict.end())
flag[i][j] = true;
}
}
fun (s, dict, res, 0, str, flag);
return res;
}
void fun (string &s, set<string> &dict, vector<string> &res, int start, string &str, vector<vector<bool> > &flag)
{
for (int i=start+1;i<=s.size();i++)
{
string tmp = s.substr(start, i-start);
if (flag[start][i-1])
{
string tmp1 = str;
str += tmp;
str += " ";
if (start + tmp.size() == s.size())
res.push_back(str);
else
fun (s, dict, res, start + tmp.size(), str, flag);
str = tmp1;
}
}
}
};
class Solution4 {
public:
vector<string> wordBreak(string s, set<string> &dict) {
return fun(s,dict);
}
vector<string> fun(string s, set<string> &dict)
{
vector<string> res;
for (int i=0;i<s.size();i++)
{
string tmp = s.substr(0, i+1);
if (dict.find(tmp) != dict.end())
{
if (i == s.size()-1)
res.push_back(tmp);
else
{
vector<string> vec = fun(s.substr(i+1), dict);
for (int j=0;j<vec.size();j++)
{
res.push_back(tmp);
res.back() += " ";
res.back() += vec[j];
}
}
}
}
return res;
}
};
class Solution {
public:
vector<string> wordBreak(string s, set<string> &dict)
{
if (mmap.find(s) != mmap.end())
return mmap[s];
vector<string> res;
for (int i=0;i<s.size();i++)
{
string tmp = s.substr(0, i+1);
if (dict.find(tmp) != dict.end())
{
if (i == s.size()-1)
res.push_back(tmp);
else
{
vector<string> vec = wordBreak(s.substr(i+1), dict);
for (int j=0;j<vec.size();j++)
{
res.push_back(tmp);
res.back() += " ";
res.back() += vec[j];
}
}
}
}
mmap.insert(pair<string, vector<string> >(s, res));
return res;
}
map <string, vector<string> > mmap;
};
//["cat", "cats", "and", "sand", "dog"].
int main()
{
Solution s;
set<string> dict;
dict.insert("cat");
dict.insert("cats");
dict.insert("and");
dict.insert("sand");
dict.insert("dog");
vector<string> res = s.wordBreak("catsanddog", dict);
print1Dvectorint(res);
}