美文网首页
140. 单词拆分 II

140. 单词拆分 II

作者: 来到了没有知识的荒原 | 来源:发表于2020-11-02 11:30 被阅读0次

    140. 单词拆分 II

    正向dfs(TLE)

    class Solution {
    public:
        vector<string> res;
        unordered_set<string> st;
    
        vector<string> wordBreak(string s, vector<string> &wordDict) {
            for (auto s:wordDict)st.insert(s);
            vector<string> path;
            dfs(s, 0, path);
            return res;
        }
    
        void dfs(const string &s, int u, vector<string> path) {
            if (u == s.size()) {
                string tmp;
                for (int i = 0; i < path.size(); i++) {
                    if (i)tmp += " ";
                    tmp += path[i];
                }
                res.push_back(tmp);
                return ;
            }
    
            for (int i = u; i < s.size(); i++) {
                auto prefix = s.substr(u, i - u + 1);
                if (st.count(prefix)) {
                    path.push_back(prefix);
                    dfs(s, i + 1, path);
                    path.pop_back();
                }
            }
        }
    };
    

    TLE的问题所在:
    比如这个样例:

    s = "catsanddog"
    wordDict = ["cat", "cats", "and", "sand", "dog"]
    

    计算过["cat","sand","dog"]后,实际上从catsand后面的已经计算过了。
    在计算到["cats","and"]的时候,实际上跟计算到["cat","sand"]后面的情况是一模一样的,但是又重复计算了一遍,造成了超时。

    反向dfs(记忆化)

    很巧妙的记忆化QAQ

    class Solution {
    public:
        unordered_map<int, vector<string>> res;
        unordered_set<string> wordSet;
    
        vector<string> wordBreak(string s, vector<string> &wordDict) {
            for (auto s:wordDict)wordSet.insert(s);
            dfs(s, 0);
            return res[0];
        }
    
        void dfs(const string &s, int index) {
            if (res.count(index)) return;
    
            if (index == s.size()) {
                res[index] = {""};
                return;
            }
    
            // res[index] = {};
            for (int i = index + 1; i <= s.size(); ++i) {
                string word = s.substr(index, i - index);
                if (wordSet.count(word)) {
                    dfs(s, i);
                    for (const string &str: res[i]) {
                        res[index].push_back(str.empty() ? word : word + " " + str);
                    }
                }
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:140. 单词拆分 II

          本文链接:https://www.haomeiwen.com/subject/nizpvktx.html