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. 操作kubernets(k8s)的增删改查

    资源的CRUD: 创建: Service service = client.services().inNamespace(namespace).create(service); 更新: Namespa ...

  2. Windows系统镜像下载站合集

    Windows系统镜像下载站合集https://latest10.win/https://msdn.itellyou.cn/https://hellowindows.cn/https://www.im ...

  3. Eclipse使用Maven搭建SSM框架时遇到的问题以及解决办法

    1.新建项目后出现:Could not caculate build plan:plugin 解决方法:删除本地.m2仓库中 org.apache.maven.plugins:maven-resour ...

  4. 依图在实时音视频中语音处理的挑战丨RTC Dev Meetup

    前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」 活动中,来自百度.寰宇科技和依图的技术专家,围绕该话题进行了 ...

  5. 车企-TSP系统通用架构设计

    最近一年用于参与到了新能源车企的管理系统的开发,并且主要从事架构设计与重难点功能开发的工作,因此有了一些小心得,特此记录(PS:整体和甲方在需求上扯皮,以及协调所有供应商这些项目管理上的事情比做开发耗 ...

  6. Flex布局原理【转载】

    引言 CSS3中的 Flexible Box,或者叫flexbox,是用于排列元素的一种布局模式. 顾名思义,弹性布局中的元素是有伸展和收缩自身的能力的. 相比于原来的布局方式,如float.posi ...

  7. 关于springboot使用mybatis查询出现空指针,以及debug出现All Elements all Null的解决方法

    数据库中命名方式是带有下划线 ,然后在实体类中使用的是驼峰命名法 ,那么就需要在application.yml文件中加上 自闭了,那么简单的问题,没了解过真是摸不着头脑

  8. QGIS 导入文本数据(WKT)

    在做GIS数据处理的时候,经常会遇到原始数据是 text.csv.Excel 等格式的数据.要使用数据前提是要先转换数据. 这里是介绍用 QGIS 导入数据.打开导入方式如下(根据自己的文本类型选择不 ...

  9. style中加了scoped无法更改element ui样式解决办法

    第一种方法 原因:scoped 解决方法:去掉scoped 注意:此时该样式会污染全局样式,可以把它放在公共的css里面 为了不让所有的 el-input标签都是该样式,可以在HTML给改input加 ...

  10. 运输问题和指派问题—R实现

    运输问题和指派问题 运输问题经常出现在计划货物配送和从某些供给地区到达需求地区之间的服务中,特别是每个供给地区(起点)的货物可获得量是有限的,每个需求地区(目的地)的货物需求量是已知的.运输问题中最常 ...