Leetcode 140单词拆分II dp + 路径记录

题目描述:

 

 题解:

和139类似,dp[i]表示子串s[0:i]能够由词典里的单词组成。题目要求返回所有可能的句子,那么额外需要用一个辅助数组存储到位置i为止所有可能的句子。在求解之前先判断一下是否有解,不事先判断的话题目有一个样例会爆

内存。

AC代码:

 vector<string> wordBreak(string s, vector<string>& wordDict)
    {
        if (!wordBreak_139(s, wordDict)) return {};

        size_t validEnd = 0;
        vector<vector<string>> dp(s.size() + 1, vector<string>());

        for (size_t i = 0; i < s.size(); i++)
        {
            if (i == validEnd + 1) return {};
            if (i != 0 && dp[i].empty()) continue;
            for (auto& word : wordDict)
            {
                size_t newEnd = i + word.size();
                if (newEnd > s.size()) continue;
                if (memcmp(&s[i], &word[0], word.size()) != 0) continue;
                validEnd = max(validEnd, newEnd);
                if (i == 0)
                {
                    dp[newEnd].push_back(word);
                    continue;
                }
                for (auto& d : dp[i])
                {
                    dp[newEnd].push_back(d + " " + word);
                }
            }
        }

        return dp.back();
    }

    bool wordBreak_139(string& s, vector<string>& wordDict)
    {
        size_t validEnd = 0;
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        for (size_t i = 0; i < s.size(); i++)
        {
            if (i == validEnd + 1) return false;
            if (!dp[i]) continue;
            for (auto& word : wordDict)
            {
                size_t newEnd = i + word.size();
                if (newEnd > s.size()) continue;
                if (memcmp(&s[i], &word[0], word.size()) == 0)
                {
                    dp[newEnd] = true;
                    validEnd = max(validEnd, newEnd);
                }
            }
        }
        return dp.back();
    }
};

 

posted @ 2020-03-22 09:41  猪突猛进!!!  阅读(168)  评论(0编辑  收藏  举报