美文网首页
Word Break I & II (Leetcode 139,

Word Break I & II (Leetcode 139,

作者: stepsma | 来源:发表于2016-12-06 02:26 被阅读0次

Word Break I
https://leetcode.com/problems/word-break/

Word Break I 中,要点是该如何节省时间。我们找到wordDict 中最长单词的长度, 然后让 j 从后往前loop,当loop到最长长度时就停止 (因为后面不会再有合适的单词了)。

bool wordBreak(string s, unordered_set<string>& wordDict) {
        if(wordDict.empty()) return false;
        int len = s.length();
        int max_len = 0;
        for(string it : wordDict){
            max_len = max(max_len, (int)it.length());
        }
        vector<int> dp(len+1, false);
        dp[0] = true;
        for(int i=0; i<s.length(); i++){
            int idx = max(0, i-max_len);
            for(int j=i; j >= idx; j--){
                if(!dp[j]) continue;
                string cur = s.substr(j, i-j+1);
                if(wordDict.count(cur)){
                    dp[i+1] = true;
                }
            }
        }
        return dp[len];
    }

Word Break II
https://leetcode.com/problems/word-break-ii/

Word Break II 中重点是prunning,如果第一次DFS search时,该string不能够被break,则以后的DFS需要跳过该string。比如:

string = aaabaaa
dict = ["a", "aa", "aaa"]

在DFS "a"的时候,可以意识到 substring "aaabaaa" 是invalid的,所以在search "aa" 的时候,应当跳过 substring "aaabaaa"。

利用一个vector<bool> 来记录 substring (i+1, n) 是否breakable。

class Solution {
public:
    
    void findcombo(vector<string> &allcomb, vector<string> &comb, vector<bool> &breakable, unordered_set<string>& wordDict, string s, int start){
        if(start == s.length()){
            //if(comb.empty()) return;
            string ret = comb[0];
            for(int i=1; i<comb.size(); i++){
                ret += " " + comb[i];
            }
            allcomb.push_back(ret);
            return;
        }
        
        for(int i=start; i<s.length(); i++){
            if(!breakable[i+1]) continue;
            string cur = s.substr(start, i-start+1);
            if(!wordDict.count(cur)) continue;
            comb.push_back(cur);
            int size = allcomb.size();
            findcombo(allcomb, comb, breakable, wordDict, s, i+1);
            comb.pop_back();
            if(allcomb.size() == size) breakable[i+1] = false;
        }
    }

    vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
        vector<string> allcomb;
        if(wordDict.empty()) return allcomb;
        vector<string> comb;
        int len = s.length();
        vector<bool> breakable(len+1, true);
        findcombo(allcomb, comb, breakable, wordDict, s, 0);
        return allcomb;
    }
};

相关文章

网友评论

      本文标题:Word Break I & II (Leetcode 139,

      本文链接:https://www.haomeiwen.com/subject/chwlmttx.html