现在的位置: 首页 > 综合 > 正文

word break II

2018年04月01日 ⁄ 综合 ⁄ 共 1416字 ⁄ 字号 评论关闭

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.

For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].

A solution is ["cats and dog",
"cat sand dog"]
.

思路:在I的基础上保存各个可能性的结果。
class Solution {
private:
    int maxLen;
    int minLen;
    bool res;
    vector<string> result;
public:
    string generate(vector<string> &saved) {
        int i,len=saved.size();
        string str = "";
        for(i=0; i<len; ++i) {
            str += saved[i];
            if (i!=len-1) 
             str += " ";
        }
        return str;
    }
    bool DFS(string s, unordered_set<string> &dict, unordered_set<string> &unMathced, vector<string> &saved, int pos) {
        if (s.size() < 1) {
            result.push_back(generate(saved));
            return true;
        }
        int i;
        bool flag = false;
        for(i=minLen; i<=maxLen&&i<=s.size(); ++i) {
            string preSuffix = s.substr(0, i);
            if (dict.find(preSuffix) == dict.end()) {
                continue;
            }
            string suffix = s.substr(i);
            if (unMathced.find(suffix) != unMathced.end()) {
                continue;
            }
            saved.resize(pos+1);
            saved[pos] = preSuffix;
            if (DFS(suffix,dict,unMathced, saved, pos+1)) {
                flag = true;
            }
            else {
                unMathced.insert(suffix);
            }
        }
        return flag;
    }
    vector<string> wordBreak(string s, unordered_set<string> &dict) {
        result.clear();
        if (dict.empty()) {
            return result;
        }
        unordered_set<string>::iterator it;
        maxLen = 0;
        minLen = INT_MAX;
        for(it=dict.begin(); it!=dict.end(); ++it) {
            if (maxLen < (*it).size()) {
                maxLen = (*it).size();
            }
            if (minLen > (*it).size()) {
                minLen = (*it).size();
            }
        }
        unordered_set<string> unMatched;
        vector<string> saved;
        res = false;
        DFS(s,dict,unMatched,saved,0);
        return result;
    }
};
【上篇】
【下篇】

抱歉!评论已关闭.