前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 140 Word Break II

LeetCode 140 Word Break II

作者头像
ShenduCC
发布2018-12-13 16:45:40
5610
发布2018-12-13 16:45:40
举报
文章被收录于专栏:算法修养算法修养

[LeetCode 140. Word Break II](https://leetcode.com/problems/word-break-ii/description/)

在上一道的动态规划的基础上,使用DFS打印路径。

在DFS的过程,需要记录下路径,这样就不会超时了。

100ms 已经算是个一个很差的解法了。

c++

```

class Solution { public: map<string,int> m; map<string,int> m2; int dp[505][505]; int dp2[505][505]; string sb; vector<string> vis[505][505]; vector<string> wordBreak(string s, vector<string>& wordDict) { for(int i=0;i<wordDict.size();i++) m[wordDict[i]]=1; memset(dp,0,sizeof(dp)); fun(s); sb=s; vector<string> ans; if(dp[0][sb.size()-1]==0) return ans ; return dfs(sb,0,sb.size()-1); } vector<string> dfs(string s,int l,int r) { vector<string> ss; vector<string> ss2; if(dp2[l][r]==1) ss.push_back(s); for(int i=l;i<r;i++) { if(dp[l][i]==1&&dp[i+1][r]==1) { vector<string> s1; vector<string> s2; if(vis[l][i].size()!=0) s1=vis[l][i]; else s1=dfs(sb.substr(l,i-l+1),l,i); if(vis[i+1][r].size()!=0) s2=vis[i+1][r]; else s2=dfs(sb.substr(i+1,r-i),i+1,r); for(int j=0;j<s1.size();j++) { for(int k=0;k<s2.size();k++) { ss.push_back(s1[j]+" "+s2[k]); } } } } m2.clear(); for(int i=0;i<ss.size();i++) { if(m2[ss[i]]==1) continue; m2[ss[i]]=1; ss2.push_back(ss[i]); } vis[l][r]=ss2; return ss2; } void fun(string s) { int len=s.length(); for(int l=1;l<=len;l++) { for(int i=0;i+l-1<len;i++) { int j=i+l-1; string s1 = s.substr(i,l); if(m[s1]==1) { dp[i][j]=1;dp2[i][j]=1;} else{ for(int k=i;k<j;k++) { if((dp[i][k]==1||dp[i][k]==2)&&(dp[k+1][j]==1||dp[k+1][j]==2)) dp[i][j]=1; } } } } } };

```

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档