leetcode之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"].

意思就是:

给定字符串s和字典集合dict, 求s分成dict中字符的几种情况.

我最开始的代码如下(直接用递归,导致超时):

class Solution{
	public:
		vector<string> wordBreak(string s, unordered_set<string> &dict){
			vector<string> result;
			string temp;
			int len = s.size()-1;
			recursion(s, dict, 0, 0,len, temp, result);
			return result;
		}
		void recursion(string s, unordered_set<string>& dict, int start, int end, int len, string temp, vector<string>& result){
			if(end == len+1){
				result.push_back(temp);
				return;
			}
			for(int i=end;i<=len;i++){
				string hehe = s.substr(start, i-start+1);
				if(dict.count(hehe) == 0){
					continue;
				}
				else{
					temp += hehe + " ";
					recursion(s, dict, i+1, i+1, len, temp, result);
					temp = "";
				}
			}
		}
};

上网找到别人的方法, 实际上可以借助第一道题"word break"的结果, 将可以切分的槽保存下来, 然后依据这些槽进行DFS, 构造结果.(实质是:依据s和dict构造图(即可以且分的槽), 然后依据图进行DFS)

代码如下:

class Solution {
public:
    vector<string> wordBreak(string s, unordered_set<string> &dict) {
			int len = s.size();
			vector<string> result;
			vector< vector<bool> > storage(len, vector<bool>(len, false));
			for(int i=0;i<len;i++){
				for(int j=i;j<len;j++){
					if(dict.count(s.substr(i, j-i+1))){
						storage[i][j] = true;
					}
				}
			}
			bool label = false;
			for(int i=0;i<len;i++){
				if(storage[i][len-1] == true){
					label = true;
					break;
				}
			}
			if(!label){
				return result;
			}
			vector<int> slot;	
			dfsTravel(s, 0, slot, result, storage);
			return result;
    }
 		void dfsTravel(string s, int start, vector<int> slot, vector<string>& result, vector< vector<bool> > storage){
			if(start == s.size()){
				string str = s;
				for(int i=0;i<slot.size()-1;i++){
					str.insert(slot[i]+i, " ");
				}
				result.push_back(str);
				return;
			}
			for(int i = 0;i<storage[start].size();i++){
				if(storage[start][i] == true){
					slot.push_back(i+1);
					dfsTravel(s, i+1, slot, result, storage);
					slot.pop_back();
				}
			}
		}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值