[LeetCode]Word Break II
来源:互联网 发布:多功能数据采集模块 编辑:程序博客网 时间:2024/04/28 14:14
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); } } } };