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. 《MySQL是怎样运行的》第二章小结

  2. Linux & 标准C语言学习 <DAY5>

    一.if分支语句     if(表达式)  //单分支语句     {           //表达式的值为真,则执行此处代码     }     if(表达式)  //双分支语句     {     ...

  3. ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  4. salesforce零基础学习(一百一十六)workflow -> flow浅谈

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.migrate_to_flow_tool_considerations_workflow.h ...

  5. Android系统服务DropBoxManagerService详解与实践应用

    作者:vivo 互联网客户端团队- Ma Lian 借助系统DropBoxManagerService对于系统文件目录dropbox管理的设计,了解其文件管理的规则.运行机制.读写机制.管控机制,根据 ...

  6. 关于在vue3中使用vuex与在vue2中使用vuex的区别

    首先vue2中vuex版本是4.x以下,vue3中使用vuex需要保证vuex版本在4.x及以上. 以下说一说怎么在vue3中使用vuex,与vue2大同小异 首先在views新建一个store文件夹 ...

  7. QML和QT

    推荐一些学习qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html,这是一个由Qt官方提供的完整的QML教程,包含了所有基本知识和高级语法. ...

  8. 彻底弄懂C#中delegate、event、EventHandler、Action、Func的使用和区别

    [目录] 1 委托 2 事件-概念的引出 3 事件-关于异常 4 事件-关于异步 5 委托-Func与Action 1 委托 在.NET中定义"委托"需要用到delegate关键字 ...

  9. python之爬虫二

    10正则表达式 正则表达式(regular expression)是一种字符串匹配模式或者规则,它可以用来检索.替换那些符合特定规则的文本.正则表达式几乎适用于所有编程语言,无论是前端语言 JavaS ...

  10. [Linux]常用命令之【hostname】

    1: 个人的片面理解: hostname是主机名(的"昵称"),而非域名.一般设置hostname,来标识当前机器的主要用途.以区别与其它机器 2: hostname的严格定义: ...