题目描述

给定一个非空的字符串s,一个非空的字符串list作为字典。通过在s中添加空格可以将s变为由list中的word表示的句子,要求返回所有可能组成的句子。设定list中的word不重复,且每一个word都可以重复使用。

算法一

先来一个暴力的方法,如下图所示:1)用一个currStr记录当前句子,初始为“”,两个指针start、end分别表示当前词word的起始和结束;2)如果word在list中则将其加入currStr中,start = end +1,否则end后移;3)重复 2)操作直到end超出s的范围。4)可以先计算list中最长word 的长度,作为end后移次数的长度限制。

这种算法存在需要对同一子字符串需要重复计算的情况,提交代码时显示Time Limit Exceeded

class Solution {
public static int maxLen = 0;
public List<String> wordBreak(String s, List<String> dict) {
List<String> res = new ArrayList<String>();
if(dict.size() == 0 || s == null || s.length() == 0) return res;
maxLen = getMaxLen(dict);
dfs(s, dict, 0, res);
return res;
} public void dfs(String s, List<String> dict, int index, List<String> res){
if(index >= s.length()){
res.add(s.trim());
return;
}
for(int i=index+1; (i<=index + maxLen) && (i<=s.length()); i++){
String word = s.substring(index, i);
if(inDict(word, dict)){
String newStr = s.substring(0, i) + " " + s.substring(i, s.length());
dfs(newStr, dict, i+1, res);
}
}
} public boolean inDict(String w, List<String> s){
for(String str : s){
if(str.equals(w)){
return true;
}
}
return false;
} public int getMaxLen(List<String> s){
int max = 0;
for(String str:s){
max = max > str.length()?max : str.length();
}
return max;
}
}

算法二

算法一之所以会超时,原因是可能对同一个的子字符串重复计算。例如s = “abcdabccc”,list = {"ab", "cd", "abcd", "ccc"}。当currStr = “ab cd”时,要对剩余子字符串“abccc”计算一次,currStr = “abcd”时,还需要对“abccc”再进行一次计算。这就是所谓的子问题重复的情况了,因此可以用动态规划来解决问题。

用一个Map来存储子字符串和其对应的所有句子组合方式。但对某一个字符串s进行查询时:若Map中包含该字符串的组合方式,则直接返回;否则,对每一个位于s开头且包含于list中的word,计算其剩余子串的句子组合方式,将其与该单词组合成新的句子。

class Solution {
public List<String> wordBreak(String s, List<String> wordDict) {
if(s == null || wordDict == null) return null;
return helper(s, wordDict, new HashMap<String, List<String>>());
} private List<String> helper(String s, List<String> wordDict,
HashMap<String, List<String>> dp){
if(dp.containsKey(s)) return dp.get(s); List<String> res = new ArrayList<>();
if(s.length() == 0) {
res.add("");
dp.put("", res);
return res;
} for(int i=0; i<wordDict.size(); i++) {
String word = wordDict.get(i);
if(s.startsWith(word)) {
List<String> restRes = helper(s.substring(word.length(), s.length()),
wordDict, dp);
if(restRes.size() != 0) {
for(String eleInRest : restRes) {
if(eleInRest.length() == 0) {
res.add(word);
}else{
res.add(word + " " + eleInRest);
}
}
}
}
}
dp.put(s, res);
return res;
}
}

LeetCode笔记:140. Word Break II的更多相关文章

  1. 【LeetCode】140. Word Break II

    Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...

  2. 【LeetCode】140. Word Break II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归求解 日期 题目地址:https://leetc ...

  3. leetcode 139. Word Break 、140. Word Break II

    139. Word Break 字符串能否通过划分成词典中的一个或多个单词. 使用动态规划,dp[i]表示当前以第i个位置(在字符串中实际上是i-1)结尾的字符串能否划分成词典中的单词. j表示的是以 ...

  4. 140. Word Break II(hard)

    欢迎fork and star:Nowcoder-Repository-github 140. Word Break II 题目: Given a non-empty string s and a d ...

  5. [LeetCode] 140. Word Break II 单词拆分II

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...

  6. 140. Word Break II

    题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...

  7. 【LeetCode OJ】Word Break II

    Problem link: http://oj.leetcode.com/problems/word-break-ii/ This problem is some extension of the w ...

  8. 139. Word Break 以及 140.Word Break II

    139. Word Break Given a non-empty string s and a dictionary wordDict containing a list of non-empty  ...

  9. leetcode@ [139/140] Word Break & Word Break II

    https://leetcode.com/problems/word-break/ Given a string s and a dictionary of words dict, determine ...

随机推荐

  1. 微信公众号替换title

    说明:项目使用 vue 开发 方法一: 单页应用里整个页面只会在第一次完全刷新,后面只会局部刷新(一般不包括head及里面的title),所以无法在服务器端控制title,只能在页面刷新的时候通过js ...

  2. Ajax原理一篇就够了

    Ajax原理一篇就够了 一.什么是Ajax Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的web开发技术,对于改善用户的体验和页面性能很有帮助.简 ...

  3. 云计算三种服务模式——IaaS、PaaS和SaaS

    云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为三个大类:SaaS(Software as a Service–软件即服务) PaaS(Platform as a Serv ...

  4. powermock单元测试小结

    最近时不时的需要单元测试来写覆盖率.简单总结一下日常心得: 1.首先指明需要测试的类:@PrepareForTest({ RewardGoldServiceImpl.class }) 2.其次在测试类 ...

  5. Redis 学习目录

    Redis in .NET Core 入门 Redis实战 - 1.String和计数器 Redis实战 - 2.list.set和Sorted Set Redis实战 - 4.Key Redis实战 ...

  6. [转] Vue中异步错误处理

    一般在一个项目开始之前,我们一般会对现有的框架做一定功能上的丰富,比如对ajax请求功能的二次封装,封装的功能可能包含了:通用错误处理,请求过滤,响应过滤等等.如果我们封装的函数叫request,那么 ...

  7. 「JOISC 2018 Day 3」比太郎的聚会

    题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...

  8. Beginning Python Games Development

    Like music and movies, video games are rapidly becoming an integral part of our lives. Over the year ...

  9. windows许可证即将过期

    win+R 输入 slmgr.vbs -xpr 查看日期 激活工具地址: 链接: https://pan.baidu.com/s/1S5nealQM1bytPYV6CYbgyg 提取码: sbmu 1 ...

  10. 相机标定问题-Matlab & Py-Opencv

    一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op    坐标表示方法(u,v)                 Unit:Dots(个) 成像坐标系:Oi      ...