class Solution {
//initialization problem will cause WA, because wordBreak whould be called several times for several cases in one instance
//the whole memozation will also record the string which has solutions, but if record this information, it will require a lot of space,
//so here we just record the string which does not have solutions.
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<string> path;
vector<string> allPaths;
unordered_set<string> unmatchedMap;
wordBreakUtil(s, dict, path, allPaths, unmatchedMap);
return allPaths;
}
private:
void wordBreakUtil(string s, unordered_set<string>& dict, vector<string>& path, vector<string>& allPaths, unordered_set<string>& unmatchedMap)
{
if(unmatchedMap.find(s) != unmatchedMap.end())
return;
if(s.size() == 0 && path.size() != 0)
{
string onePath;
for(int i = 0; i < path.size(); ++i)
{
if(i != 0) onePath += " ";
onePath += path[i];
}
allPaths.push_back(onePath);
return;
}
for(int i = 0; i < s.size(); ++i)
{
string newWord = s.substr(0, i+1);
if(dict.find(newWord) != dict.end())
{
int oldSize = allPaths.size();
path.push_back(newWord);
string remainStr = s.substr(i+1);
wordBreakUtil(remainStr, dict, path, allPaths, unmatchedMap);
path.pop_back();
if(oldSize == (int)allPaths.size()) unmatchedMap.insert(remainStr);
}
}
}
};
[LeetCode]Word Break II
最新推荐文章于 2024-08-29 09:49:18 发布