zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Goahead 3.1.0 发布,嵌入式 Web 服务器
    jdao 1.0.2 发布,轻量级的orm工具包
    pythonbitstring 3.1.0 发布
    JavaScript 搜索引擎 lunr.js
    Difeye 1.1.4 版本发布
    Chronon 3.5 发布,支持 Java 7
    性能扩展的那些事儿:一味增加硬件并不能解决响应时间问题
    Eclipse SDK 4.2.2/Equinox 3.8.2 发布
    Linux Kernel 3.8.1 发布
    Armadillo C++ Library 3.800 发布
  • 原文地址:https://www.cnblogs.com/fu11211129/p/4999001.html
Copyright © 2011-2022 走看看