2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。力扣140。

福大大 答案2021-10-16:

具体见代码。

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

package main

import "fmt"

func main() {
s := "catsanddog"
wordDict := []string{"cat", "cats", "and", "sand", "dog"}
ret := wordBreak(s, wordDict)
fmt.Println(ret)
} type Node struct {
path0 string
end bool
nexts []*Node
} func NewNode() *Node {
res := &Node{}
res.end = false
res.nexts = make([]*Node, 26)
return res
} func wordBreak(s string, wordDict []string) []string {
str := []byte(s)
root := gettrie(wordDict)
dp := getdp(s, root)
path0 := make([]string, 0)
ans := make([]string, 0)
process(str, 0, root, dp, &path0, &ans)
return ans
} // str[index.....] 是要搞定的字符串
// dp[0...N-1] 0... 1.... 2... N-1... 在dp里
// root 单词表所有单词生成的前缀树头节点
// path str[0..index-1]做过决定了,做的决定放在path里
func process(str []byte, index int, root *Node, dp []bool, path0 *[]string, ans *[]string) {
if index == len(str) {
builder := make([]byte, 0)
for i := 0; i < len((*path0))-1; i++ {
builder = append(builder, []byte(fmt.Sprintf("%s", (*path0)[i])+" ")...)
}
builder = append(builder, []byte(fmt.Sprintf("%s", (*path0)[len((*path0))-1])+" ")...)
*ans = append(*ans, string(builder))
} else {
cur := root
for end := index; end < len(str); end++ {
// str[i..end] (能不能拆出来)
road := str[end] - 'a'
if cur.nexts[road] == nil {
break
}
cur = cur.nexts[road]
if cur.end && dp[end+1] {
// [i...end] 前缀串
// str.subString(i,end+1) [i..end]
*path0 = append(*path0, cur.path0)
process(str, end+1, root, dp, path0, ans)
*path0 = (*path0)[0 : len((*path0))-1]
}
}
}
} func gettrie(wordDict []string) *Node {
root := NewNode()
for _, str := range wordDict {
chs := []byte(str)
node := root
index := 0
for i := 0; i < len(chs); i++ {
index = int(chs[i] - 'a')
if node.nexts[index] == nil {
node.nexts[index] = NewNode()
}
node = node.nexts[index]
}
node.path0 = str
node.end = true
}
return root
} func getdp(s string, root *Node) []bool {
str := []byte(s)
N := len(str)
dp := make([]bool, N+1)
dp[N] = true
for i := N - 1; i >= 0; i-- {
cur := root
for end := i; end < N; end++ {
path := str[end] - 'a'
if cur.nexts[path] == nil {
break
}
cur = cur.nexts[path]
if cur.end && dp[end+1] {
dp[i] = true
break
}
}
}
return dp
}

执行结果如下:


左神java代码

2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。的更多相关文章

  1. [Swift]LeetCode140. 单词拆分 II | Word Break II

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

  2. [LeetCode] 140. 单词拆分 II

    题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...

  3. 140. 单词拆分 II

    Q: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分隔时可以重复使用字典 ...

  4. Java实现 LeetCode 140 单词拆分 II(二)

    140. 单词拆分 II 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分 ...

  5. 算法——单词拆分 II

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 链接: leetcode. 解题思路 ...

  6. [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 ...

  7. Noip模拟78 2021.10.16

    这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...

  8. Java实现 LeetCode 140 单词拆分II

    class Solution { public List<String> wordBreak(String s, List<String> wordDict) { List&l ...

  9. Android布局中的空格以及占一个汉字宽度的空格的实现

    在Android布局中进行使用到空格,以便实现文字的对齐.那么在Android中如何表示一个空格呢? 空格:  窄空格:  一个汉字宽度的空格:   [用两个空格(  )占一个汉字的宽度时,两个空格比 ...

  10. Android布局中的空格以及占一个汉字宽度的空格,实现不同汉字字数对齐

    前言 在Android布局中进行使用到空格,以便实现文字的对齐.那么在Android中如何表示一个空格呢? 空格: (普通的英文半角空格但不换行) 窄空格:   (中文全角空格 (一个中文宽度))   ...

随机推荐

  1. kendo UI级联与过滤的区别

    级联的话子项与父项是有默认值的,不会显示全部

  2. Spring注解和一些类

    Spring基础相关 声明Bean,类注解 @Component@Service@Repository IOC,自动注入,属性注解 @AutoWired @Resource @Inject 其他 @I ...

  3. Keepalived+HAProxy基于ACL实现单IP多域名负载功能

    编译安装 HAProxy 新版 LTS 版本,编译安装 Keepalived 开启HAProxy多线程,线程数与CPU核心数保持一致,并绑定CPU核心 因业务较多避免配置文件误操作,需要按每业务一个配 ...

  4. Bootstarp5第二弹

    四.网格系统 网格系统根据设备屏幕尺寸大小分为6类: col-<!--任意屏幕--> col-sm-<!--平板 - 屏幕宽度等于或大于 576px.--> col-md-&l ...

  5. Kustomize 生产实战-注入监控 APM Agent

    Kustomize 简介 Kubernetes 原生配置管理工具, 它自定义引入了一种无需模板的方式来定制应用程序配置,从而简化了对现成应用程序的使用.目前,在kubectl中内置了,通过 apply ...

  6. Java (强/弱/软/虚)引用

    一.整体架构

  7. MySQL高可用架构-MMM、MHA、MGR、分库分表

    总结 MMM是是Perl语言开发的用于管理MySQL主主同步架构的工具包.主要作用:管理MySQL的主主复制拓扑,在主服务器失效时,进行主备切换和故障转移. MMM缺点:故障切换可能会丢事务(主备使用 ...

  8. Java多线程(一篇从0讲透)

    多线程 思维导图看天下: 1. 概述 并行与并发 并行 :指两个或多个事件在同一时刻发生(同时发生) 并发 :指两个或多个事件在同一个时间段内发生.(交替执行) 线程与进程 进程:是指一个内存中运行的 ...

  9. hdfs集群的扩容和缩容

    目录 1.背景 2.集群黑白名单 3.准备一台新的机器并配置好hadoop环境 3.1 我们现有的集群规划 3.2 准备一台新的机器 3.2.1 查看新机器的ip 3.2.2 修改主机名和host映射 ...

  10. vue自定义密码输入框解决浏览器自动填充密码的问题

    pre { overflow-y: auto; max-height: 300px } img { max-width: 500px; max-height: 300px } 问题描述 浏览器对于ty ...