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. (转载)Python 浅析线程(threading模块)和进程(process)

    线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...

  2. 使用arcgis按掩膜批量处理MODIS.tif数据提取研究区.shp边界的python代码

    在输入代码之前,需要先用arcgis把需要处理的数据导入,再把研究区shp导入,然后定义投影,先掩膜处理一个数据,再进行下一步输入代码批量处理数据的步骤.如果 不先定义投影,可能会出现输入代码不执行的 ...

  3. Vue插件开发,全局插件和按需加入插件

    年前手下事情少,找了一个下午研究了一下Vue插件开发,首先要感谢B站的前端小野森森-2,借鉴了他的视频,自己也写了一下.把过程记录下来. 首先用vite建一个空项目. 然后新建modules文件夹,和 ...

  4. 【LeetCode回溯算法#08】递增子序列,巩固回溯算法中的去重问题

    递增子序列 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例 1: 输入:nums = [4,6,7,7] ...

  5. 在golang中如何正确判断接口是否为nil

    本文主要来分析一下在golang中,如何判断interface是否为nil,以及相关注意事项. 正常情况下,我们声明一个interface类型的变量,默认值将会返回nil,以golang自带的io.W ...

  6. 百炼成钢 —— 声网实时网络的自动运维丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网大数据算法工程师黄南薰. 01 自动运维介绍 2016 年,Gartner 创新性地提出了 AIOps 的概念[1],开创了人工智能辅助运维决 ...

  7. 20张图说清楚 IP 协议

    大家好,我是风筝 轻解网络系列又来了,今天咱们说说 IP 协议,这可是网络协议中最最核心的一个协议了,还记得我们刚刚知道什么是IP地址.怎么给电脑修改 IP 的时候吗?今天我们就来探究一下 IP 协议 ...

  8. JVM加载中初始化时机?什么时候不会进行初始化?

    初始化的过程是给静态变量赋予指定值以及执行静态代码块的过程. 当遇到new,getstatic,putstatic,invokestatic指令时要进行初始化,也就是new实例化对象,调用静态变量以及 ...

  9. 开发者需掌握的超实用VS Code for Windows快捷键

    链接|https://dev.to/devland/100-crucial-keyboard-shortcuts-for-vs-code-users-4474 作者|Thomas Sentre 翻译| ...

  10. 系统评价——理想点TOPSIS法的R语言实现(五)

    TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距.TOPSIS全称Technique for Order Preference by Simi ...