[每日一题]140. Word Break II

题目描述

本题难度:Hard
作题日期:2017年3月26日
本题地址: leetcode.com/problems/wo…javascript

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. You may assume the dictionary does not contain duplicate words.

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"].复制代码

分析和解答

这道题是本周关于回溯的 Hard 题。java

暴力法

首先能想到的是暴力法,遍历全部的可能。算法

以题意中的例子作分析数组

s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].缓存



图一

咱们从左到右遍历 catsanddog:学习

  1. 当前子串为 c,不符合要求
  2. 当前子串为 ca,不符合要求
  3. 当前子串为 cat,符合要求,接着求 sanddog 子串的结果, 如图二所示
  4. 当前子串是 cats, 符合要求...


图二

步骤 3 ,一直递归下去,咱们能够获得结果 ["cat sand dog"]优化

代码以下:spa


图三

图三的代码是暴力搜索全部的可能,会引发 超时异常(黑话是 TLE, 全称 Time Limit Exceeded),以下图所示的case。code



图四

通过观察,咱们发现图四的test case有一个特色,就是有不少重复的字符: 有不少重复的子串,在暴力算法中有大量的重复计算。cdn

因此,咱们能够在图三的代码的基础上作优化:缓存结果。

DP = 记忆优化 + 剪枝

在图一和图二的分析中,咱们能够知道,遍历全部的可能解的过程当中 ,有许多重复的分支。

s = "aaaaaaaaaa", word_dic = ["aa", "aaa", "aaaa", "aaaaa"] 为例子



图五

如图五所示,在某一次递归求解的过程当中,子串 "aa" 会被被重复的计算 5 次(若是是屡次递归,计算的次数会更多)。咱们能够将 "aa" 的结果缓存到一个 HashTable 中,这样就能够减小大量重复的计算。

Tips: 缓存通常都是用哈希,数组用的比较少,由于用数组会有空间浪费。



图六

Tips: 自顶向下的DP其实就是暴力搜索 + 缓存。

自底向上的思路

在上面的分析中,咱们能够发现一个规律:在递归的过程当中,咱们实际上是将字符串分红两个子串:

  1. 将10个a, 分红2个a 和 8 个a 的结果的组合: "aa" + "aaaaaaaa"
  2. 8 个 a 又能够分红 2 个 a 和 6 个 a的组合: "aa" + "aaaaaa"
  3. ... ...

因此,咱们能够获得以下的思路:假设 字符串当前的位置是 nf(n) 表示全部的可能解, w(x) 表示 从位置 xn 的子串:

f(n) = w(n) f(n-1) + w(n-1) f(n-2) + ... + w(0)

以 catsanddog 为例子,以下图所示



图七

代码实现以下

Tips 1: 自底向上的DP有一个小窍门:逆向思考。好比咱们在分析该问题的时候,通常是考虑从起始点 0 到 结束点 i 的子串结果,这不利于推导DP公式。咱们应该这样思考:以 i 为结尾的子串做为处理的单元。这么思考的好处,咱们会自动的思考 i - 1 与 i 之间的关系,而且方便的推导他们之间的关系。

最佳提交

关于咱们

每日一道算法题是一个纯粹的算法学习社区:经过天天一块儿作一道算法题来提高咱们的算法能力。

每日一题算法群如今一共有3000位小伙伴:有来自北美和国内顶尖名校的本科生、研究生和博士生;也有来自国内外各大互联网公司(Google, Facebook, 亚马逊, 百度, 阿里, 腾讯等)的经验丰富的开发者。

你们汇集只为一个目的:天天一块儿学习算法!

咱们坚信:学习算法是一种信仰!

长按下面的二维码,关注每日一道算法题公众号,跟咱们一块儿学习算法!

附录






相关文章
相关标签/搜索