转载地址:https://blog.csdn.net/gao1440156051/article/details/52192981
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;
- };