zoukankan      html  css  js  c++  java
  • 140. Word Break II(hard)

    欢迎fork and star:Nowcoder-Repository-github

    140. Word Break II

    题目:

     Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. You may assume the dictionary does not contain duplicate words.
    
    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"].
    
    UPDATE (2017/1/4):
    The wordDict parameter had been changed to a list of strings (instead of a set of strings). Please reload the code definition to get the latest changes. 
    

    解析

    • unordered_set& dict办版本
    	//运行时间:4ms
    	//占用内存:508k
    
    class Solution {
    
    	vector<string> combine(string word, vector<string> prev){
    		for (int i = 0; i < prev.size(); ++i){
    			prev[i] += " " + word;
    		}
    		return prev;
    	}
    
    public:
    	vector<string> wordBreak(string s, unordered_set<string>& dict) {
    		
    		vector<string> result;
    		if (dict.count(s)){ //a whole string is a word
    			result.push_back(s);
    		}
    		for (int i = 1; i < s.size(); ++i){
    			string word = s.substr(i);
    			if (dict.count(word)){
    				string rem = s.substr(0, i);
    				vector<string> prev = combine(word, wordBreak(rem, dict));
    				result.insert(result.end(), prev.begin(), prev.end());
    			}
    		}
    		
            reverse(result.begin(), result.end());
    		return result;
    	}
    };
    
    • 暴力超时
    namespace test
    {
    	vector<string> wordBreak(string s, unordered_set<string> &dict) {
    		//暴力搜索,不能ac,复杂度超了。
    		vector<string> res;
    		int size = s.length();
    		for (int i = 0; i < size; i++){
    			string tmp = s.substr(0, i + 1);
    			if (dict.count(tmp))
    				findNext(res, s, dict, tmp, i + 1);
    		}
    		return res;
    	}
    
    	void findNext(vector<string> & res, string s, unordered_set<string> &dict, string tmp, int i){
    		int size = s.length();
    		if (i >= size){
    			res.push_back(tmp);
    			return;
    		}
    		for (int j = 1; j <= size - i; ++j){
    			string now = s.substr(i, j);
    			if (dict.count(now)){
    				findNext(res, s, dict, tmp + ' ' + now, i + j);
    			}
    		}
    	}
    }
    
    
    

    题目来源

  • 相关阅读:
    try catch finally return
    github结合TortoiseGit使用sshkey,无需输入账号和密码
    github上fork别人的代码之后,如何保持和原作者同步的更新
    第9章 浅度和深度复制
    9.7结构类型
    excel在msdn上的说明文档
    9.6接口和抽象类
    [LeetCode]N-Queens II
    鸟哥Linux私房菜知识汇总8至9章
    Memcahce(MC)系列(三)Memcached它PHP转让
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8099147.html
Copyright © 2011-2022 走看看