您的位置:首页 > 其它

139. Word Break(难)

2016-08-12 16:34 183 查看


139. 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"
.

设dp[i]为前i个字符是否可以切割。

则dp[i]=dp[j]&&s.substr(j,i-j)

class Solution {
public:
bool wordBreak(string s, unordered_set<string>& wordDict) {
int len=s.size();
vector<bool> dp(len+1,false);
dp[0]=true;
for(int i=1;i<=len;i++){
for(int j=i-1;j>=0;j--){
if(dp[j]&&wordDict.count(s.substr(j,i-j))){
dp[i]=true;
break;
}
}
}
return dp[len];
}
};

140. 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:
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
if(m.count(s)){
return m[s];
}
vector<string> res;
if(wordDict.count(s)){//此时s直接在字典中
res.push_back(s);
}
for(int i=1;i<s.size();i++){
string last=s.substr(i);
if(wordDict.count(last)){
string pre=s.substr(0,i);
vector<string> tmp=combine(last,wordBreak(pre,wordDict));
res.insert(res.end(),tmp.begin(),tmp.end());
}
}
m[s]=res;//记忆
return res;
}
private:
vector<string> combine(string last,vector<string> pre){
for(int i=0;i<pre.size();i++){
pre[i]+=" "+last;
}
return pre;
}

unordered_map<string,vector<string>> m;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: