Word Break II

来源:互联网 发布:华为软件发布 编辑:程序博客网 时间:2024/05/16 17:52

使用二位bool数组来标记前驱的办法会超时,用vector<int>的数组既节省空间,又节省时间。

另一个需要注意的地方是在寻找i的前驱节点j时,在 Word Break I找到一个j可以直接break,而此处需要找到所有的j。

在DFS的过程中,path传值即可。此处如果用引用,需要退栈(删除最后一个word),反而会更加麻烦。

class Solution {public:    vector<string> wordBreak(string s, unordered_set<string> &dict) {        const int n = s.size();        vector<int> table[n+1];        for(int i=1; i<=n; i++)            for(int j=i-1; j>=0; j--)                if(dict.find(s.substr(j, i-j)) != dict.end() && (j==0 || table[j].size()))                    table[i].push_back(j);        vector<string> result;        if(table[n].size() == 0)            return result;        dfs(table, s, "", result, n);        return result;    }    void dfs(vector<int> table[], string &s, string path, vector<string> &result, int cur)    {        if(cur == 0)        {            path.erase(path.size()-1);            result.push_back(path);            return;        }        for(int i=0; i<table[cur].size(); i++)        {            string word = s.substr(table[cur][i], cur-table[cur][i]);            dfs(table, s, word + " " + path, result, table[cur][i]);        }    }};


0 0