• 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);
    			}
    		}
    	}
    }
    
    
    

    题目来源

  • 相关阅读:
    EasyUI--Alert()
    asp.net 页面之间传值的几种方式
    c# 的类成员
    c# protected public private internal
    C#中的多态性
    c# 静态成员和实例成员的区别
    js确认框confirm()用法实例详解
    JS中的switch case
    分分钟用上C#中的委托和事件
    Asp.net MVC中关于@Html标签Label、Editor使用
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8099147.html
Copyright © 2020-2023  润新知