LeetCode ||& Word Break && Word Break II(转)——动态规划
一、
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".
1 class Solution { 2 public: 3 bool wordBreak(string s, unordered_set<string> &dict) { 4 int len=s.length(); 5 vector<bool> v(len+1,false); 6 v[0]=true; 7 for(int pos=0;pos<len;pos++){ 8 for(int i=pos;v[pos]&&i<len;i++){ 9 if(dict.find(s.substr(pos,i-pos+1))!=dict.end()) 10 v[i+1]=true; 11 } 12 } 13 return v[len]; 14 } 15 };
二、
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"]
.
即不仅要确定字符串是否能被字典分割,还要找出所有可能的组合。参考word break那题的DP思路,首先,从尾部开始逆向看字符串 s ,循环截取一个存在的词(milestone 1),然后在截取的位置递归,继续向前看,继续截取。。。知道到达头部,此时组合出一种答案;然后进入milestone 1 处的下一次循环,如下图的milestone 1‘,截取另外一个词,找另外一个答案。。。
代码如下:
-
1 class Solution { 2 vector<string> midres; 3 vector<string> res; 4 vector<bool> *dp; 5 public: 6 vector<string> wordBreak(string s, unordered_set<string> &dict) { 7 int len = s.length(); 8 9 dp = new vector<bool>[len]; 10 for(int i=0; i<len; ++i){ 11 for(int j=i; j<len; ++j){ 12 if(dict.find(s.substr(i, j-i+1))!=dict.end()){ 13 dp[i].push_back(true); //第二维的下标实际是:单词长度-1 14 }else{ 15 dp[i].push_back(false); //数组第二维用vector,size不一定是n,这样比n*n节省空间 16 } 17 } 18 } 19 func(s, len-1); 20 return res; 21 } 22 23 void func(const string &s, int i){ 24 if(i>=0){ 25 for(int j=0; j<=i; ++j){ 26 27 if(dp[j][i-j]){ //注意此处的第二个下标是 i-j,不是i,因为数组的第二维长度是不固定的,第二维的下标实际是单词长度-1 28 29 midres.push_back(s.substr(j, i-j+1)); 30 func(s, j-1); 31 midres.pop_back(); //继续考虑for循环的下一个分段处 32 } 33 } 34 return; 35 } 36 else{ 37 string str; 38 for(int k=midres.size()-1; k>=0; --k){ //注意遍历的顺序是倒序的 39 str += midres[k]; //注意此处是k,不是i 40 if(k>0) 41 str += " "; 42 } 43 res.push_back(str); 44 return; 45 } 46 } 47 };
注意递归函数的技巧,用全局变量res来保存答案,每次递归成功到达头部时将此中间结果保存到res。
转自:http://blog.csdn.net/jiadebin890724/article/details/34829865
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了