本文已参与「新人创作礼」活动,一起开启掘金创作之路。
原文链接: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;
}
};