Fork me on GitHub

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


题目来源

posted @ 2017-12-24 20:39  ranjiewen  阅读(283)  评论(0编辑  收藏  举报