https://oj.leetcode.com/problems/word-break-ii/
class Solution { public: unordered_set<string> dict; string s; unordered_map<string, vector<string> > memory; //用来记录一个string可以的组成 vector<string> wordBreak(string s, unordered_set<string> &dict) { memory.clear(); this->dict = dict; this->s = s; return subWordBreak(s); } vector<string> subWordBreak(string &s) { //先看是否之前处理过这个 子串 if(memory.find(s) != memory.end()) return memory[s]; // 新建一个 memory中的项,即返回值 vector<string> result; if(s.size() <= 0) return result; // 广度,然后递归 // 个数 for(int i = 1; i <= s.size(); i++) { // 找出所有合理的小片段,再递归剩下的片段 // if is a valid, belongs to dict string subS = s.substr(0,i); if(dict.find(subS) != dict.end()) { if(i == s.size()) result.push_back(subS); else { // 递归调用 剩下的部分 string leftstr = s.substr(i,s.size() - i); vector<string> tmp = subWordBreak(leftstr); for(int j = 0; j < tmp.size(); j++) { string item = subS; item.append(" "); item.append(tmp[j]); result.push_back(item); } } } } memory.insert(make_pair(s,result)); return result; } };