给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
- 分隔时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
示例 1:
输入: s = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"] 输出: [ "cats and dog", "cat sand dog" ]
示例 2:
输入: s = "pineapplepenapple" wordDict = ["apple", "pen", "applepen", "pine", "pineapple"] 输出: [ "pine apple pen apple", "pineapple pen apple", "pine applepen apple" ] 解释: 注意你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog" wordDict = ["cats", "dog", "sand", "and", "cat"] 输出: []
结合单词拆分1,在dp过程将句子存下来。结果超出内存限制
class Solution
{
public:
vector<string> wordBreak(string s, vector<string> &wordDict)
{
vector<string> ans;
if (wordDict.size() <= 0)
{
return ans;
}
if (s.size() <= 0)
{
return ans;
}
map<string, bool> Check;
map<int, vector<string>> save;
for (int i = 0; i < wordDict.size(); i++)
{
Check[wordDict[i]] = true;
}
vector<bool> dp(s.size(), false);
for (int i = 0; i < s.size(); i++)
{
string temp(s.begin(), s.begin() + i + 1);
if (Check[temp])
{
dp[i] = true;
save[i].push_back(temp);
}
for (int j = 0; j < i; j++)
{
if (dp[j] == true)
{
string temp2(s.begin() + j + 1, s.begin() + i + 1);
if (Check[temp2])
{
dp[i] = true;
for (int k = 0; k < save[j].size(); k++)
{
save[i].push_back(save[j][k] + ' ' + temp2);
}
}
}
}
}
return save[s.size() - 1];
}
};
原因是存储了整个字符串句子,使map需要存储的数据过大。
我们只存储当时匹配到的一段字符串。
最后再用DFS去搜索答案。
DP加DFS
class Solution
{
map<int, vector<string>> save;
vector<string> ans;
public:
vector<string> wordBreak(string s, vector<string> &wordDict)
{
if (wordDict.size() <= 0)
{
return ans;
}
if (s.size() <= 0)
{
return ans;
}
map<string, bool> Check;
for (int i = 0; i < wordDict.size(); i++)
{
Check[wordDict[i]] = true;
}
vector<bool> dp(s.size(), false);
for (int i = 0; i < s.size(); i++)
{
string temp(s.begin(), s.begin() + i + 1);
if (Check[temp])
{
dp[i] = true;
save[i].push_back(temp);
}
for (int j = 0; j < i; j++)
{
if (dp[j] == true)
{
string temp2(s.begin() + j + 1, s.begin() + i + 1);
if (Check[temp2])
{
dp[i] = true;
save[i].push_back(temp2);
}
}
}
}
if(!dp[s.size() - 1])
return ans;
DFS(s.size(), "");
return ans;
}
void DFS(int len, string s)
{
if(len == 0)
{
ans.push_back(s);
return;
}
for (int i = 0; i < save[len - 1].size(); i++)
{
DFS(len - save[len - 1][i].size(), save[len - 1][i]+ (s == ""? "" : " ") + s);
}
}
};