LintCode 582: Word Break II

77 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

原文链接:blog.csdn.net/roufoo/arti…

Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

Example Example 1:

Input:“lintcode”,[“de”,“ding”,“co”,“code”,“lint”] Output:[“lint code”, “lint co de”] Explanation: insert a space is “lint code”,insert two spaces is “lint co de”. Example 2:

Input:“a”,[] Output:[] Explanation:dict is null.

解法1:DFS+Memorization 把s按pos=1,2,…,len-1切成2半,如果前半部subStr1在dict里面, 那么后半部subStr2就可以按子问题处理。 注意要Memorization,不然过不了下面的input case: “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa” [“a”,“aa”,“aaa”,“aaaa”,“aaaaa”,“aaaaaa”,“aaaaaaa”,“aaaaaaaa”,“aaaaaaaaa”,“aaaaaaaaaa”]

代码如下:

class Solution {
public:
    /*
     * @param s: A string
     * @param wordDict: A set of words.
     * @return: All possible sentences.
     */
    vector<string> wordBreak(string &s, unordered_set<string> &wordDict) {
        map<string, vector<string>> memo;
        return helper(s, wordDict, memo);
    }

private:
    vector<string> helper(string &s, unordered_set<string> &wordDict, map<string, vector<string>> &memo) {
        int len = s.size();
        if (len == 0) return {};
        if (memo.find(s) != memo.end()) return memo[s];
        
        vector<string> result;
        for (int i = 1; i <= len; ++i) {
            string subStr1 = s.substr(0, i);
            if (wordDict.find(subStr1) != wordDict.end()) {
                if (subStr1.size() == len) {
                    result.push_back(subStr1);   
                } else {
                    string subStr2 = s.substr(i);
                    vector<string> tmpRes;
                    tmpRes = helper(subStr2, wordDict, memo);
                    //tmpRes = helper(subStr2, wordDict);
                    for (auto t : tmpRes) {
                        result.push_back(subStr1 + " " + t);
                    }
                }
            }
        }
        
        memo[s] = result;
        return result;
    }
};