• leetcode@ [139/140] Word Break & Word Break II


    https://leetcode.com/problems/word-break/

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

    For example, given
    s = "leetcode",
    dict = ["leet", "code"].

    Return true because "leetcode" can be segmented as "leet code".

    class Solution {
    public:
        bool wordBreak(string s, unordered_set<string>& wordDict) {
            if(s.length() == 0) return false;
            
            vector<bool> canBreak(s.length(), false);
            for(int i=0;i<s.length();++i) {
                if(wordDict.find(s.substr(0, i+1)) != wordDict.end()) {
                    canBreak[i] = true;
                    continue;
                }
                for(int pre=0;pre<i;++pre) {
                    if(canBreak[pre] && wordDict.find(s.substr(pre+1, i-pre)) != wordDict.end()) {
                        canBreak[i] = true;
                        break;
                    }
                }
            }
            
            return canBreak[s.length()-1];
        }
    };
    View Code

    https://leetcode.com/problems/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.

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

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

    class Solution {
    public:
        void findBreakPoint(vector<bool>& canBreak, string& s, unordered_set<string>& wordDict) {
            for(int i=0;i<s.length();++i) {
                if(wordDict.find(s.substr(0, i+1)) != wordDict.end()) {
                    canBreak[i] = true;
                    continue;
                }
                for(int pre=0;pre<i;++pre) {
                    if(canBreak[pre] && wordDict.find(s.substr(pre+1, i-pre)) != wordDict.end()) {
                        canBreak[i] = true;
                        break;
                    }
                }
            }
        }
        void dfs(vector<string>& res, vector<string>& load, vector<bool>& canBreak, string& s, unordered_set<string>& wordDict, int idx) {
            if(idx == s.length()-1) {
                 string tmp = "";
                 for(int i=0;i<load.size()-1;++i) tmp += load[i] + " ";
                 if(load.size()>0) tmp+=load[load.size()-1];
                 res.push_back(tmp);
                 return;
            }
            
            for(int nx=idx+1;nx<s.length();++nx) {
                if(canBreak[nx] && wordDict.find(s.substr(idx+1, nx-idx)) != wordDict.end()) {
                    load.push_back(s.substr(idx+1, nx-idx));
                    dfs(res, load, canBreak, s, wordDict, nx);
                    load.pop_back();
                }
            }
        }
        vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
            vector<bool> canBreak(s.length(), false);
            vector<string> res; res.clear();
            vector<string> load; load.clear();
            
            findBreakPoint(canBreak, s, wordDict);
            if(canBreak[s.length()-1]) dfs(res, load, canBreak, s, wordDict, -1);
            return res;
        }
    };
    View Code
  • 相关阅读:
    BAT带队烧钱圈地华为们猛追云计算
    各浏览器的cookie的name个数/最大容量限制测试
    多备份:云端数据物流平台为企业提供云备份服务(通过增值服务盈利,数据备份相当于买保险)
    多备份CEO胡茂华:创业路上的五道坎
    蜡笔同步:同步通讯录,同步短信,用电脑发短信
    MIUI是小米的核心竞争力
    tggg
    Ubuntu 创建启动器
    TProcedure,TMethod,TNotifyEvent,TWndMethod的区别,并模拟点击按钮后发生的动作
    所有语言的Awesome
  • 原文地址:https://www.cnblogs.com/fu11211129/p/4999001.html
Copyright © 2020-2023  润新知