2021-10-15:单词拆分。给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。力扣139。

福大大 答案2021-10-15:

自然智慧。从左往右尝试,用前缀树。如果没路了,就不需要试了。
时间复杂度:O(N)。
额外空间复杂度:O(N)。

代码用golang编写。代码如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. if true {
  5. s := "leetcode"
  6. wordDict := []string{"leet", "code"}
  7. ret := wordBreak1(s, wordDict)
  8. fmt.Println(ret)
  9. }
  10. if true {
  11. s := "leetcode"
  12. wordDict := []string{"leet", "code"}
  13. ret := wordBreak2(s, wordDict)
  14. fmt.Println(ret)
  15. }
  16. }
  17. type Node struct {
  18. end bool
  19. nexts []*Node
  20. }
  21. func NewNode() *Node {
  22. res := &Node{}
  23. res.end = false
  24. res.nexts = make([]*Node, 26)
  25. return res
  26. }
  27. func wordBreak1(s string, wordDict []string) bool {
  28. root := NewNode()
  29. for _, str := range wordDict {
  30. chs := []byte(str)
  31. node := root
  32. index := 0
  33. for i := 0; i < len(chs); i++ {
  34. index = int(chs[i] - 'a')
  35. if node.nexts[index] == nil {
  36. node.nexts[index] = NewNode()
  37. }
  38. node = node.nexts[index]
  39. }
  40. node.end = true
  41. }
  42. str := []byte(s)
  43. N := len(str)
  44. dp := make([]bool, N+1)
  45. dp[N] = true // dp[i] word[i.....] 能不能被分解
  46. // dp[N] word[N...] -> "" 能不能够被分解
  47. // dp[i] ... dp[i+1
  48. for i := N - 1; i >= 0; i-- {
  49. // i
  50. // word[i....] 能不能够被分解
  51. // i..i i+1....
  52. // i..i+1 i+2...
  53. cur := root
  54. for end := i; end < N; end++ {
  55. cur = cur.nexts[str[end]-'a']
  56. if cur == nil {
  57. break
  58. }
  59. // 有路!
  60. if cur.end {
  61. // i...end 真的是一个有效的前缀串 end+1.... 能不能被分解
  62. dp[i] = dp[i] || dp[end+1]
  63. }
  64. if dp[i] {
  65. break
  66. }
  67. }
  68. }
  69. return dp[0]
  70. }
  71. func wordBreak2(s string, wordDict []string) int {
  72. root := NewNode()
  73. for _, str := range wordDict {
  74. chs := []byte(str)
  75. node := root
  76. index := 0
  77. for i := 0; i < len(chs); i++ {
  78. index = int(chs[i] - 'a')
  79. if node.nexts[index] == nil {
  80. node.nexts[index] = NewNode()
  81. }
  82. node = node.nexts[index]
  83. }
  84. node.end = true
  85. }
  86. str := []byte(s)
  87. N := len(str)
  88. dp := make([]int, N+1)
  89. dp[N] = 1
  90. for i := N - 1; i >= 0; i-- {
  91. cur := root
  92. for end := i; end < N; end++ {
  93. cur = cur.nexts[str[end]-'a']
  94. if cur == nil {
  95. break
  96. }
  97. if cur.end {
  98. dp[i] += dp[end+1]
  99. }
  100. }
  101. }
  102. return dp[0]
  103. }

执行结果如下:


左神java代码

2021-10-15:单词拆分。给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你的更多相关文章

  1. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

  2. 注册许可证出现“输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非空白字符”

    问题描述: 引入失败!输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符.两个以上的填充字符,或者填充字符间包含非空白字符 解决方案: 去注册cloud7.0的产品,重新引入 ...

  3. FromBase64String 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符

    js前台: <input id="upload_img_input" v-on:change="onFileChange" type="file ...

  4. Noip模拟77 2021.10.15

    T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移 ...

  5. 2021.10.15考试总结[NOIP模拟77]

    \(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...

  6. 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符

    正常URL: http://localhost:16990/GoodsOrder/OrderRevoke.aspx??6G5lFi6xuoiLDhfOOOIkBYwy8RGpkfuza2gLlJrlT ...

  7. 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)

    单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆 ...

  8. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  9. 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  10. 剑指offer-第六章面试中的各项能力(翻转单词的顺序VS左旋转字符串)

    //题目1:翻转单词顺序例如“Hello world!”翻转后为world! Hello. //思路:首先翻转整个字符串,然后再分别翻转每个单词. //题目2:左旋转字符串,是将字符串的前面几个(n) ...

随机推荐

  1. 10. XrmToolBox

    XrmToolBox是一个连接到MicrosoftDataverse的Windows应用程序,可以为任何在MicrosoftDataverse上构建的产品提供了简化定制.配置和操作任务的工具,包括Dy ...

  2. 如何使用webgl(three.js)实现3D消防、3D建筑消防大楼、消防数字孪生、消防可视化解决方案——第十八课(一)

    序: 又是很久没出随笔文章了,一篇文章有时候整理一天,实在是抽不出来时间. 最近在回顾几年前的项目时,发现这个智慧三维消防可视化项目很有回顾价值,索性就拿出来讲讲. 首先,我们要知道消防里的知识,不是 ...

  3. 22.this指针

    1.this指针工作原理 我们知道,c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会共用 ...

  4. python + BeautifulSoup + selenium 实现爬取中医智库的古籍分类的数据

    爬取内容为 该图片下的七个分类, 然后对应的每个种类的书本信息(摘要和目录) 效果为 代码如下 import requests from bs4 import BeautifulSoup import ...

  5. 雪花算法 SnowFlake 内部结构【分布式ID生成策略】

    更多内容,前往IT-BLOG 一.前言   如何在分布式集群中生产全局唯一的 ID?[方案一]UUID:UUID是通用唯一识别码 (Universally Unique Identifier),在其他 ...

  6. JS中关于原型对象与原型链的理解!

    1.首先我们先来看一张图 prototype 每个函数都有一个 prototype 属性每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每 ...

  7. JavaScript快速入门(二)

    文件中引入JavaScript 嵌入到HTML文件中 在body或者head中添加script标签 <script> var age = 10; console.log(age); < ...

  8. python之修改本地Ip地址

    安装模块pip install wmi # -*- coding: cp936 -*- # # FileName: ModifyIP.py # Date : 2008-01-15 # import w ...

  9. pnpm 之降本增效

    作者:京东科技 于振京 受众简介 前端研发工程师 还在为npm i安装大量依赖等待时间较长,npm扁平化node_modules依赖版本冲突在苦恼吗,不用苦恼pnpm为你保驾护航 主要影响:安装依赖包 ...

  10. Java设计模式 —— 组合模式

    11 组合模式 11.1 组合模式概述 Composite Pattern: 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式使得客户端可以统一处理单个对象和组合对象. 组合模式关 ...