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. 07-Spring的事务处理

    Spring中提供了七种事务的传播行为: PROPAGATION_REQUIRED:默认值,最常用,统一事务,出现异常,全部回滚 其余参考Spring事务处理word文档. 0.原转账业务(不含事务处 ...

  2. GCC编译器编译过程

    GCC编译器编译过程 #生成test可执行文件 g++ test.cpp -o test 其实,上述命令可以分解为以下几个步骤 1. 预处理-Pre-Processing # -E 选择指示编译器仅对 ...

  3. 机器学习(二):感知机+svm习题 感知机手工推导参数更新 svm手推求解二维坐标超平面直线方程

    作业1: 输入: 训练数据集 \(T = {(x1; y1); (x2; y2),..., (xN; yN)}\) 其中,\(x \in R^n\), \(y \in Y = \{+1, -1\}\) ...

  4. MyBatisPlus 整合 SpringBoot 遇见的问题(二)

    [异常]:Cause: java.sql.SQLSyntaxErrorException: Unknown column 'udf1' in 'field list'...... SQL: SELEC ...

  5. .Net 6.0定义全局当前身份缓存对象

    背景: 当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时需要创建人或者一些权限的访问,都得用到当 ...

  6. C#中抽象方法与虚方法的区别详解及示例

    1. 抽象方法与虚方法的区别   先说两者最大的区别:抽象方法是需要子类去实现的.虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求.因为抽象类无法实例化,所以抽象方法没有办法被调用,也就 ...

  7. Three.js 进阶之旅:全景漫游-初阶移动相机版

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 摘要 3D 全景技术可以实现日常生活中的很多功能需求,比如地图的街景全景模式.数 ...

  8. 集合-HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...

  9. 迁移学习(TSRP)《Improving Pseudo Labels With Intra-Class Similarity for Unsupervised Domain Adaptation》

    论文信息 论文标题:Improving Pseudo Labels With Intra-Class Similarity for Unsupervised Domain Adaptation论文作者 ...

  10. 数据泵:oracle数据泵导入导出部分用户

    问题描述:需要将140服务器中的tbomnew实例下的部分用户导入到118服务器下的tbompx实例中,本次导入导出的两个数据库均为19C 部分用户名:CORE,MSTDATA,BOMMGMT,CFG ...