Title

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

示例 1:

输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。

示例 2:

输入: s = “applepenapple”, wordDict = [“apple”, “pen”]
输出: true
解释: 返回 true 因为 “applepenapple” 可以被拆分成 “apple pen apple”。
注意你可以重复使用字典中的单词。

示例 3:

输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]
输出: false

动态规划

Solve

定义dp[i]表示字符串s前i个字符组成的字符串s[0…i-1]是否能被空格拆分成若干个字典中出现的单词。

从前往后计算考虑转移方程,每次转移的时候需要枚举包含位置i-1的最后一个单词,看它是否出现在字典中以及去除这部分的字符串是否合法即可。

公式化来说,需要枚举s[0…i-1]中的分割点j,看s[0…j-1]组成的字符串s1(默认j=0时s1为空串)和s[j…i-1]组成的字符串s2是否都合法,如果两个字符串都合法,那么按照定义s1和s2拼接成的字符串也同样合法。

由于计算到dp[i]时已经计算出dp[0…i-1]的值,因此字符串s1是否合法可以直接由dp[j]得知,剩下的只需要看s2是否合法即可,因此可以得出如下转移方程:dp[i]=dp[j] && check(s[j…i−1]),其中check(s[j…i−1]) 表示子串 s[j…i-1] 是否出现在字典中。

对于检查一个字符串是否出现在给定的字符串列表里一般可以考虑哈希表来快速判断,同时也可以做一些简单的剪枝,枚举分割点的时候倒着枚举,如果分割点 j 到 i 的长度已经大于字典列表里最长的单词的长度,那么就结束枚举,但是需要注意的是下面的代码给出的是不带剪枝的写法。

对于边界条件,我们定义 dp[0]=true 表示空串且合法。

Code

class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:length = len(s)if not wordDict:return not sdp = [False] * (length + 1)dp[0] = Truefor i in range(1, length + 1):for j in range(i - 1, -1, -1):if dp[j] and s[j: i] in wordDict:dp[i] = Truebreakreturn dp[-1]

复杂度分析

时间复杂度:O(n2),其中 n 为字符串 s 的长度。我们一共有 O(n) 个状态需要计算,每次计算需要枚举 O(n) 个分割点,哈希表判断一个字符串是否出现在给定的字符串列表需要 O(1) 的时间,因此总时间复杂度为 O(n2)。

空间复杂度:O(n) ,其中 n 为字符串 s 的长度。我们需要 O(n) 的空间存放 dp 值以及哈希表亦需要 O(n) 的空间复杂度,因此总空间复杂度为 O(n)。

139. Word Break 单词拆分相关推荐

  1. 【记忆化递归+DP】LeetCode 139. Word Break

    LeetCode 139. Word Break Solution1: 记忆化递归的典型套路题 参考网址:https://zxi.mytechroad.com/blog/leetcode/leetco ...

  2. [LeetCode] Word Break II 拆分词句之二

    [LeetCode] Word Break II 拆分词句之二 Given a string s and a dictionary of words dict, add spaces in s to ...

  3. leetcode 139. Word Break | 139. 单词拆分(动态规划)

    题目 https://leetcode.com/problems/word-break/ 题解 时隔一天,再次遇到 dp 问题- 本题和 leetcode 375. Guess Number High ...

  4. 139. Word Break

    一.题目 1.审题 2.分析 给出一个字符串 S,一个字典表 dict,判断 S 是否能由 dict 中的字符串所组成,其中 dict 中的字符串能够多次使用. 二.解答 1.思路: 方法一. 使用一 ...

  5. java把一段英文拆成单词_Java Word Break(单词拆解)

    给定一个字符串 String s = "leetcode" dict = ["leet", "code"]. 查看一下是够是字典中的词语组成 ...

  6. leetcode 140. Word Break II | 140. 单词拆分 II(动态规划)

    题目 https://leetcode.com/problems/word-break-ii/ 题解 由 leetcode 139. Word Break | 139. 单词拆分(动态规划) 改造而来 ...

  7. 【Leetcode】139. 拆分词句(Word Break)

    Leetcode - 139 Word Break (Medium) 题目描述:给定一个字符串 s 与字典 wordDict,判断 s 是否能拆分成 wordDict 中的子字符串. Input: s ...

  8. 刷题第45, 46天 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数、139.单词拆分

    70. Climbing Stairs 题目链接:70. Climbing Stairs 思路链接:代码随想录动态规划-爬楼梯(进阶) 思路 思路 Code class Solution {publi ...

  9. leetcode - 139. 单词拆分

    139. 单词拆分 -------------------------------------------- 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以 ...

最新文章

  1. iOS 性能优化总结
  2. java最长类名_在java规范中类命名的字符长度是多少?
  3. 所有你要知道的 BERT 模型压缩方法,都在这里!
  4. CSS三角形如何工作?
  5. EPML schema(附带用myeclipse生成的结构图)
  6. java 打印日志log_java如何LOG打印出日志信息
  7. 算法 | 最速降线问题与最小旋转面问题(变分法)
  8. 巡检水中机器人_物联卡的应用,管廊隧道巡检机器人“上岗”啦!
  9. HD1561The more, The Better(树形DP+有依赖背包)
  10. jq select操作全集
  11. 在Java 8 Lambda中创建自己的循环结构
  12. OSX/Linux 配置SSH免密登录并配置(Alias)别名登录
  13. Bailian2813 画家问题【暴力】
  14. 正则表达式:基础知识学习
  15. 《构建之法》阅读笔记1
  16. 站内消息弹出层简单实现
  17. vue安装vue-pdf(预览pdf)(2021/03/02)
  18. [BZOJ]4198 [NOI2015] 荷马史诗 哈夫曼树
  19. vue 使用pug(详细说明)
  20. 雅思两次7.5经验分享~希望帮你冲击雅思高分!

热门文章

  1. github删除错误的commit并保留之前的提交
  2. clone()与image和 cloneTo()
  3. AutoComplete - 自动完成插件
  4. 最大熵学习笔记(六)优缺点分析
  5. php 配置(转载其他)
  6. python秒表小项目_适合新手练习的几个python小项目
  7. 在计算机中 鼠标器属于,在计算机中,鼠标器属于()。
  8. android版本相机权限,Android 11系统权限收紧,第三方APP仅支持调用原生相机
  9. java基础深入_java编程基础之方法深入
  10. 打印数组所有排列 python