博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Word Break II
阅读量:6955 次
发布时间:2019-06-27

本文共 2655 字,大约阅读时间需要 8 分钟。

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

 

// DFSpublic class Solution {    public ArrayList
wordBreak(String s, Set
dict) { ArrayList
result = new ArrayList
(); if(s == null || s.length() == 0) return result; int len = s.length(); boolean[] dp = new boolean[len+1]; dp[0] = true; for(int i = 0; i< len ; i++){ if(!dp[i]) continue; for(String e : dict){ int end = i+ e.length(); if(end > len) continue; String sub = s.substring(i, end); if(dict.contains(sub)) dp[end] = true; } } if(dp[len] == false) return result; StringBuilder sb = new StringBuilder(); dfs(0, sb, s, dict, result); return result; } private void dfs(int start, StringBuilder sb, String s, Set
dict, ArrayList
result){ int len = s.length(); if(start >= len){ result.add(new String(sb)); return; } for(int i = start+1; i<= len; i++){ String sub = s.substring(start, i); if(dict.contains(sub)){ int oldLen = sb.length(); if(oldLen != 0){ sb.append(" "); } sb.append(sub); dfs(i, sb, s, dict, result); sb.delete(oldLen, sb.length()); } } }}

 

 

 

DP + Backtrack

// DP + back track    public ArrayList
wordBreak2(String s, Set
dict) { int n = s.length(); ArrayList
> pres = new ArrayList
>( n); // initialize for (int i = 0; i < n; ++i) pres.add(new ArrayList
()); // DP. pres[i] stores position j where should insert space for (int i = 0; i < n; ++i) { for (int j = 0; j <= i; ++j) { String suffix = s.substring(j, i + 1); if ((j == 0 || pres.get(j - 1).size() > 0) && dict.contains(suffix)) pres.get(i).add(j); } } return getPath(s, n, pres); } public ArrayList
getPath(String s, int n, ArrayList
> pres) { ArrayList
res = new ArrayList
(); for (int pre : pres.get(n - 1)) { if (pre == 0) { res.add(s.substring(0, n)); } else { ArrayList
preres = getPath(s, pre, pres); String sub = s.substring(pre, n); for (String ss : preres) res.add(ss + " " + sub); } } return res; }

 

转载于:https://www.cnblogs.com/RazerLu/p/3555217.html

你可能感兴趣的文章
Linux软件包管理之源码安装
查看>>
求两个数的最大公约数两种方法
查看>>
Nginx+keepalived(部分配置)
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
结对编程讲义-PPT
查看>>
SOLR
查看>>
成为Android高手必须掌握的28大项内容和10个建议
查看>>
配置Nutch模拟浏览器以绕过反爬虫限制
查看>>
详解变量声明提升和函数声明提升
查看>>
小牛电动的软文列表,和实际用户的反馈实在是天上地下。。
查看>>
list()详解
查看>>
mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
查看>>
IBM WebSphere MQ win 安装过程
查看>>
获取目录下子目录及文件的大小
查看>>
DNS服务器基本服务(正向、反向解析)、别名、递归、迭代、增量传输、完全传输...
查看>>
varchar nvarchar char nchar varchar2 nvarchar2
查看>>
js 百度地图 添加自定义控件
查看>>
UIscrollview、UITableView中实现点击按钮折叠文字和展开文字
查看>>
VIM教程二
查看>>