139. Word Break

转载地址: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)

[cpp]  view plain  copy
  1. class Solution {  
  2. public:  
  3.     bool wordBreak(string s, unordered_set<string>& wordDict) {  
  4.         int len=s.size();  
  5.         vector<bool> dp(len+1,false);  
  6.         dp[0]=true;  
  7.         for(int i=1;i<=len;i++){  
  8.             for(int j=i-1;j>=0;j--){  
  9.                 if(dp[j]&&wordDict.count(s.substr(j,i-j))){  
  10.                     dp[i]=true;  
  11.                     break;  
  12.                 }  
  13.             }  
  14.         }  
  15.         return dp[len];  
  16.     }  
  17. };  

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


用记忆递归
思路:不断切两刀,后面的有效,再递归前面的。

[cpp]  view plain  copy
  1. class Solution {  
  2. public:  
  3.     vector<string> wordBreak(string s, unordered_set<string>& wordDict) {  
  4.         if(m.count(s)){  
  5.             return m[s];  
  6.         }  
  7.         vector<string> res;  
  8.         if(wordDict.count(s)){//此时s直接在字典中  
  9.             res.push_back(s);  
  10.         }  
  11.         for(int i=1;i<s.size();i++){  
  12.             string last=s.substr(i);  
  13.             if(wordDict.count(last)){  
  14.                 string pre=s.substr(0,i);  
  15.                 vector<string> tmp=combine(last,wordBreak(pre,wordDict));  
  16.                 res.insert(res.end(),tmp.begin(),tmp.end());  
  17.             }  
  18.         }  
  19.         m[s]=res;//记忆  
  20.         return res;  
  21.     }  
  22. private:  
  23.     vector<string> combine(string last,vector<string> pre){  
  24.         for(int i=0;i<pre.size();i++){  
  25.             pre[i]+=" "+last;  
  26.         }  
  27.         return pre;  
  28.     }  
  29.   
  30.     unordered_map<string,vector<string>> m;  
  31. };  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值