Question
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"]
.
MySolution
class Solution {
map<string, vector<string>> map_words; // F(i, N)
public:
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
/*动态规划解题
1. 边界条件:s在dic中,返回s
2. F(0, N) = ||_{i = 1, N}{F(0, i) + F(i, N)}
*/
auto tmp = map_words.find(s); // 加速
if(tmp != map_words.end())
{
return tmp->second;
}
vector<string> rst;
if(wordDict.find(s) != wordDict.end()) // 整体一个词
{
rst.push_back(s);
}
for(int i = 1; i < s.size(); ++i)
{
string tmpSub = s.substr(0, i);
if(wordDict.find(tmpSub) != wordDict.end()) // 开头截取一个词
{
auto tmpRst = wordBreak(s.substr(i), wordDict); // 剩余部分的词
for(auto &tmpR: tmpRst)
{
rst.push_back(tmpSub + " " + tmpR);
}
}
}
map_words[s] = rst;
return rst;
}
};