LeetCode OJ--Word Break II ***@

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;
    }
};
 
原文地址:https://www.cnblogs.com/qingcheng/p/3887023.html