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
  • 相关阅读:
    《深入理解 Java 虚拟机》读书笔记:线程安全与锁优化
    《深入理解 Java 虚拟机》读书笔记:Java 内存模型与线程
    《深入理解 Java 虚拟机》读书笔记:晚期(运行期)优化
    《深入理解 Java 虚拟机》读书笔记:早期(编译期)优化
    《深入理解 Java 虚拟机》读书笔记:虚拟机字节码执行引擎
    《深入理解 Java 虚拟机》读书笔记:虚拟机类加载机制
    Java学习书籍推荐
    IntelliJ IDEA之新建项目后之前的项目不见了
    剑指Offer之左旋转字符串
    剑指Offer之和为S的两个数字
  • 原文地址:https://www.cnblogs.com/fu11211129/p/4999001.html
Copyright © 2011-2022 走看看