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<vector<string>> possible(s.length());
stack<string> m_stack;
for(int i=0; i < s.size(); i++)
{
for ( auto it = dict.begin(); it != dict.end(); ++it )
{
string subString = s.substr(i, (*it).size());
if(subString == *it)
{
possible[i + (*it).size() - 1].push_back(subString);
}
}
}
vector<string> cur;
buildResult(possible, cur, s.size() - 1);
return m_result;
}
void buildResult(vector<vector<string> > possible, vector<string>& cur, int index)
{
if(index < 0)
{
string result = "";
for(int i = cur.size() - 1; i >= 0; i--)
{
result += cur[i];
if(i != 0)
result += ' ';
}
m_result.insert(m_result.begin(), result);
return;
}
for(int i = 0; i < possible[index].size(); i++)
{
cur.push_back(possible[index][i]);
buildResult(possible, cur, index - possible[index][i].size());
cur.pop_back();
}
}
private:
vector<string> m_result;
};
Round 2:
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
bool possible[s.size()+1];
memset(possible, 1, sizeof(possible));
vector<string> result;
string cur;
dfs(s, wordDict, result, 0, cur, possible);
return result;
}
private:
void dfs(string s, unordered_set<string> &wordDict, vector<string> &result, int start, string &cur, bool possible[])
{
int size = s.size();
if(start == size)
{
result.push_back(cur.substr(0, cur.size()-1));
}
for(int i = start; i < size; i++)
{
string temp = s.substr(start, i-start+1);
if(wordDict.find(temp) != wordDict.end() && possible[i+1])
{
cur += temp;
cur += " ";
int countSolution = result.size();
dfs(s, wordDict, result, i+1, cur, possible);
if(result.size() == countSolution)
possible[i+1] = false;
cur = cur.substr(0, cur.size() - temp.size() - 1);
}
}
}
};