int length;
vector<string> one_result;
vector<string> result;
vector<vector<bool> > is_word;
void backTrack(string &s, int last, int index, vector<string> &one_result)
{
if(last == length)
{
string str;
for(int i = 0; i < one_result.size(); ++i)
{
str.append(one_result[i]);
if(i != one_result.size() - 1)
str.append(" ");
}
result.push_back(str);
return;
}
for(int i = last; i < length; ++i)
{
if(is_word[last][i])
{
one_result.push_back(s.substr(index, i - index + 1));
backTrack(s, i+1, i+1, one_result);
one_result.pop_back();
}
}
}
vector<string> wordBreak(string s, unordered_set<string>& wordDict)//unordered_set
{
if(s.empty() || wordDict.empty())
return result;
length= s.size();
is_word.assign(length, vector<bool>(length, false));
for(int i = 0; i < length; ++i)
{
for(int j = i; j < length; ++j)
{
if(wordDict.count(s.substr(i, j - i + 1)) > 0)
is_word[i][j] = true;
}
}
//第一个字母开头就不能划分
int index = 0;
for(index = 0; index < length; ++index)
{
if(is_word[0][index])
break;
}
if(index == length)
return result;
//最后一个单词不能划分
index = 0;
for(index = 0; index < length; ++index)
{
if(is_word[index][length-1])
break;
}
if(index == length)
return result;
backTrack(s, 0, 0, one_result);
return result;
}
vector<string> one_result;
vector<string> result;
vector<vector<bool> > is_word;
void backTrack(string &s, int last, int index, vector<string> &one_result)
{
if(last == length)
{
string str;
for(int i = 0; i < one_result.size(); ++i)
{
str.append(one_result[i]);
if(i != one_result.size() - 1)
str.append(" ");
}
result.push_back(str);
return;
}
for(int i = last; i < length; ++i)
{
if(is_word[last][i])
{
one_result.push_back(s.substr(index, i - index + 1));
backTrack(s, i+1, i+1, one_result);
one_result.pop_back();
}
}
}
vector<string> wordBreak(string s, unordered_set<string>& wordDict)//unordered_set
{
if(s.empty() || wordDict.empty())
return result;
length= s.size();
is_word.assign(length, vector<bool>(length, false));
for(int i = 0; i < length; ++i)
{
for(int j = i; j < length; ++j)
{
if(wordDict.count(s.substr(i, j - i + 1)) > 0)
is_word[i][j] = true;
}
}
//第一个字母开头就不能划分
int index = 0;
for(index = 0; index < length; ++index)
{
if(is_word[0][index])
break;
}
if(index == length)
return result;
//最后一个单词不能划分
index = 0;
for(index = 0; index < length; ++index)
{
if(is_word[index][length-1])
break;
}
if(index == length)
return result;
backTrack(s, 0, 0, one_result);
return result;
}