2021-10-13:单词接龙。字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:序列中第一个单词是 beginWord 。序列中最后一个单词是 endWord 。每次转换只能改变一个字母。转换过程中的中间单词必须是字典 wordList 中的单词。给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。力扣127。

福大大 答案2021-10-13:

宽度优先遍历。找邻居。

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

package main

import "fmt"

func main() {
beginWord := "hit"
endWord := "cog"
wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}
ret := ladderLength1(beginWord, endWord, wordList)
fmt.Println(ret) } // start,出发的单词
// to, 目标单位
// list, 列表
// to 一定属于list
// start未必
// 返回变幻的最短路径长度
func ladderLength1(start string, to string, list0 []string) int {
list0 = append(list0, start) // key : 列表中的单词,每一个单词都会有记录!
// value : key这个单词,有哪些邻居!
nexts := getNexts(list0)
// abc 出发 abc -> abc 0
//
// bbc 1
distanceMap := make(map[string]int)
distanceMap[start] = 1
set := make(map[string]struct{})
set[start] = struct{}{}
queue := make([]string, 0)
queue = append(queue, start)
for len(queue) > 0 {
cur := queue[0]
queue = queue[1:]
distance := distanceMap[cur]
for _, next := range nexts[cur] {
if next == to {
return distance + 1
}
if _, ok := set[next]; !ok {
set[next] = struct{}{}
queue = append(queue, next)
distanceMap[next] = distance + 1
}
} }
return 0
} func getNexts(words []string) map[string][]string {
dict := make(map[string]struct{})
for _, word := range words {
dict[word] = struct{}{}
}
nexts := make(map[string][]string)
for i := 0; i < len(words); i++ {
nexts[words[i]] = getNext(words[i], dict)
}
return nexts
} // 应该根据具体数据状况决定用什么来找邻居
// 1)如果字符串长度比较短,字符串数量比较多,以下方法适合
// 2)如果字符串长度比较长,字符串数量比较少,以下方法不适合
func getNext(word string, dict map[string]struct{}) []string {
res := make([]string, 0)
chs := []byte(word)
for i := 0; i < len(chs); i++ {
for cur := 'a'; cur <= 'z'; cur++ {
if chs[i] != byte(cur) {
tmp := chs[i]
chs[i] = byte(cur)
if _, ok := dict[fmt.Sprintf("%s", chs)]; ok {
res = append(res, fmt.Sprintf("%s", chs))
}
chs[i] = tmp
}
}
}
return res
} func ladderLength2(beginWord string, endWord string, wordList []string) int {
dict := make(map[string]struct{})
for _, word := range wordList {
dict[word] = struct{}{}
}
if _, ok := dict[endWord]; !ok {
return 0
}
startSet := make(map[string]struct{})
endSet := make(map[string]struct{})
visit := make(map[string]struct{})
startSet[beginWord] = struct{}{}
endSet[endWord] = struct{}{}
for len0 := 2; len(startSet) > 0; len0++ {
// startSet是较小的,endSet是较大的
nextSet := make(map[string]struct{})
for w, _ := range startSet {
// w -> a(nextSet)
// a b c
// 0
// 1
// 2
for j := 0; j < len(w); j++ {
ch := []byte(w)
for c := 'a'; c <= 'z'; c++ {
if byte(c) != w[j] {
ch[j] = byte(c)
next := fmt.Sprintf("%c", ch)
if _, ok := endSet[next]; ok {
return len0
}
_, ok1 := dict[next]
_, ok2 := visit[next]
if ok1 && !ok2 {
nextSet[next] = struct{}{}
visit[next] = struct{}{}
}
}
}
}
}
// startSet(小) -> nextSet(某个大小) 和 endSet大小来比
//startSet = (nextSet.size() < endSet.size()) ? nextSet : endSet;
startSet = endSet
if len(nextSet) < len(endSet) {
startSet = nextSet
}
//endSet = (startSet == nextSet) ? endSet : nextSet;
b := len(startSet) == len(endSet)
if b {
for ss, _ := range startSet {
if _, ok := endSet[ss]; ok { } else {
b = false
break
}
}
}
if !b {
endSet = nextSet
}
}
return 0
}

执行结果如下:


左神java代码

2021-10-13:单词接龙。字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:序列中第一个单词是 beginWord 。序列中最后的更多相关文章

  1. 日常Java 2021/10/13

    Java枚举 values(), ordinal()和valueOf()方法位于java.lang.Enum类中: values()返回枚举类中所有的值 ordinal()方法可以找到每个枚举常量的索 ...

  2. Leetcode 126.单词接龙II

    单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能 ...

  3. Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)

    Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  4. LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)

    题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...

  5. 126. 单词接龙 II

    题目: 链接:https://leetcode-cn.com/problems/word-ladder-ii/ 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出 ...

  6. 图-搜索-BFS-DFS-126. 单词接龙 II

    2020-03-19 13:10:35 问题描述: 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序 ...

  7. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  8. Java实现 LeetCode 126 单词接龙 II

    126. 单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: ...

  9. [Swift]LeetCode126. 单词接龙 II | Word Ladder II

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  10. [Swift]LeetCode127. 单词接龙 | Word Ladder

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...

随机推荐

  1. 使用yarn启用项目,报错无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系 统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。

    这是由于新版win10 安装的时候会出现: 解决 搜索powershell,右键以管理员身份运行 2.打开之后,执行命令set-ExecutionPolicy RemoteSigned更改 Power ...

  2. 多线程中使用COM 的注意事项

    最近做了一个TCP Server的程序,其中需用使用COM组件,但是tcp 的部分是阻塞的,所以开了一个线程用来专门接收来自客户端的信号,当接收到信号后,再根据情况处理. 按照这个思路,在程序的一开始 ...

  3. odoo 权限管理学习总结

    环境 odoo-14.0.post20221212.tar base_user_role-12.0.2.1.2.zip 下载地址: https://apps.odoo.com/apps/modules ...

  4. GO语言学习笔记-包结构篇 Study for Go ! Chapter eight - Package Structure

    持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs ...

  5. Python练习--简单练习(一看就能写出来的代码)

    两数之和 数字的阶乘 求圆的面积 (输入半径,求解圆的面积) 求区间内所有素数的和 求前N个数字的平方和

  6. 使用Docker搭建MinIO集群服务

    概述 因为在云服务器上默认只有一块磁盘,如果直接在系统盘上安装MinIO,会被拒绝,所以这里采用Docker的方式绕过这一限制 操作环境 操作系统 CentOS 7.9 MinIO版本 RELEASE ...

  7. 文件的上传&预览&下载学习(四)

    0.参考博客 https://blog.csdn.net/Chengzi_comm/article/details/53037967 逻辑清晰 https://blog.csdn.net/alli09 ...

  8. Java面试——架构设计与分布式

    更多内容,移步 IT-BLOG 一.用 Java 自己实现一个 LRU LRU(Least Recently Used:最近最少使用):简单的说,就是保证基本的 Cache容量,如果超过容量则必须丢掉 ...

  9. 用Python基于Google Bard做一个交互式的聊天机器人

    用Python基于Google Bard做一个交互式的聊天机器人 之前已经通过浏览器试过了 Google Bard ,更多细节请看: Try out Google Bard, Will Google ...

  10. JS中我们为什么要new个实例而不直接执行

    正常情况:<script> function sayHello() { alert("hello") } sayHello();直接调用他 </script> ...