139. Word Break(难)
原创
©著作权归作者所有:来自51CTO博客作者mb63887cf57331d的原创作品,请联系作者获取转载授权,否则将追究法律责任
139. Word Break
s and a dictionary of words dict, determine if s
For example, given
s = "leetcode"
,
dict = ["leet", "code"]
."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
s and a dictionary of words dict, add spaces in s
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.["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;
};