Word Break II
阿新 • • 發佈:2018-12-25
dp+dfs
class Solution { private: //DFS path build function void buildPath(vector<bool>& isBreakable, string &s, int pos, vector<string> &res, string curP, vector<string>& wordDict, int minlen, int maxlen) { int i, len = s.size(); for (i = minlen; i <= min(maxlen, len - pos); ++i) { string sTmp = s.substr(pos, i); if (isBreakable[pos + i] && find(wordDict.begin(), wordDict.end(), sTmp) != wordDict.end()) { if (pos + i == len) res.push_back(curP + s.substr(pos, i)); else buildPath(isBreakable, s, pos + i, res, curP + s.substr(pos, i) + " ", wordDict, minlen, maxlen); } } } public: vector<string> wordBreak(string s, vector<string>& wordDict) { int sSize = s.size(), len, i, minlen = INT_MAX, maxlen = INT_MIN; vector<string> res; vector<bool> isBreakable(sSize + 1, false); for (string &word : wordDict) { // find the minimum and maximum word length minlen = min(minlen, (int)word.size()); maxlen = max(maxlen, (int)word.size()); } //DP to build isBreakable for (i = sSize - minlen, isBreakable[sSize] = true; i >= 0; --i) for (len = minlen; len <= min(maxlen, sSize - i); ++len) { string sTmp = s.substr(i, len); if (isBreakable[i + len] && find(wordDict.begin(),wordDict.end(),sTmp)!=wordDict.end()) { isBreakable[i] = true; break; } } //if breakable, do DFS path building if (isBreakable[0]) buildPath(isBreakable, s, 0, res, "", wordDict, minlen, maxlen); return res; } };