2021-09-07:单词接龙 II。按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 这样的单词序列,并满足:每对相邻的单词之间仅有单个字母不同。转换过程中的每个单词 si(1 <= i <= k)必须是字典 wordList 中的单词。注意,beginWord 不必是字典 wordList 中的单词。sk == endWord,给你两个单词 beginWord 和 endWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWord 到 endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 [beginWord, s1, s2, …, sk] 的形式返回。力扣126。

福大大 答案2021-09-07:

递归。遍历找邻居。
时间复杂度:O(kN)和O(26k*k)。

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

package main

import "fmt"

func main() {

    beginWord := "hit"
endWord := "cog"
wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}
ret := findLadders(beginWord, endWord, wordList)
fmt.Println(ret) } func findLadders(start string, end string, list0 []string) [][]string {
list0 = append(list0, start)
nexts := getNexts(&list0)
distances := getDistances(start, nexts)
pathList := make([]string, 0)
res := make([][]string, 0)
getShortestPaths(start, end, nexts, distances, &pathList, &res)
return res
} //
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
} // word, 在表中,有哪些邻居,把邻居们,生成list返回
func getNext(word string, dict map[string]struct{}) []string {
res := make([]string, 0)
chs := []byte(word)
for cur := byte('a'); cur <= 'z'; cur++ {
for i := 0; i < len(chs); i++ {
if chs[i] != cur {
tmp := chs[i]
chs[i] = cur
if _, ok := dict[fmt.Sprintf("%s", chs)]; ok {
res = append(res, fmt.Sprintf("%s", chs))
}
chs[i] = tmp
}
}
}
return res
} // 生成距离表,从start开始,根据邻居表,宽度优先遍历,对于能够遇到的所有字符串,生成(字符串,距离)这条记录,放入距离表中
func getDistances(start string, nexts map[string][]string) map[string]int { distances := make(map[string]int)
distances[start] = 0
queue := make([]string, 0)
queue = append(queue, start)
set := make(map[string]struct{})
set[start] = struct{}{}
for len(queue) > 0 {
//cur := queue[len(queue)-1]
//queue = queue[0 : len(queue)-1]
cur := queue[0]
queue = queue[1:]
for _, next := range nexts[cur] {
if _, ok := set[next]; !ok {
distances[next] = distances[cur] + 1
queue = append(queue, next)
set[next] = struct{}{}
}
}
}
return distances
} // cur 当前来到的字符串 可变
// to 目标,固定参数
// nexts 每一个字符串的邻居表
// cur 到开头距离5 -> 到开头距离是6的支路 distances距离表
// path : 来到cur之前,深度优先遍历之前的历史是什么
// res : 当遇到cur,把历史,放入res,作为一个结果
func getShortestPaths(cur string, to string, nexts map[string][]string, distances map[string]int, path *[]string, res *[][]string) {
*path = append(*path, cur)
if to == cur {
//res.add(new LinkedList<String>(path));
pathcopy := make([]string, len(*path))
copy(pathcopy, *path)
*res = append(*res, pathcopy)
} else {
for _, next := range nexts[cur] {
if distances[next] == distances[cur]+1 {
getShortestPaths(next, to, nexts, distances, path, res)
}
}
}
//path.pollLast();
*path = (*path)[0 : len(*path)-1]
}

执行结果如下:


左神java代码

2021-09-07:单词接龙 II。按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -的更多相关文章

  1. Leetcode 126.单词接龙II

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

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

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

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

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

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

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

  5. lintcode 单词接龙II

    题意 给出两个单词(start和end)和一个字典,找出所有从start到end的最短转换序列 比如: 1.每次只能改变一个字母. 2.变换过程中的中间单词必须在字典中出现. 注意事项 所有单词具有相 ...

  6. [LeetCode] 126. 单词接龙 II

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

  7. 126. 单词接龙 II

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

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

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

  9. 单词接龙(dragon)(BFS)

    单词接龙(dragon) 时间限制: 1 Sec  内存限制: 64 MB提交: 12  解决: 5[提交][状态][讨论版] 题目描述 单 词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已 ...

  10. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

随机推荐

  1. 如何让Macbook Touch Bar 一直显示F1~F12

    原始状态 修改过程 系统偏好设置 > 键盘 将Touch Bar Shous 修改为F1, F2 ,etc. 结果

  2. Android工程接入UnityLibrary工程

    目录结构 Unity工程指UnityLibrary目录下文件: 安卓工程指app目录下文件: 整体指App目录下不包括app和UnityLibrary: 1.Unity打包时勾选导出安卓工程: 拷贝g ...

  3. ABAC框架-casbin

    参考文档:https://www.kancloud.cn/oldlei/casbin/1289455 参考博客:https://www.cnblogs.com/studyzy/p/11380736.h ...

  4. 如何基于 React Native 快速实现一个视频通话应用

    今天,我们将会一起开发一个包含 RTE (实时互动)场景的 Flutter 应用. 项目介绍 靠自研开发包含实时互动功能的应用非常繁琐,你要解决维护服务器.负载均衡等难题,同时还要保证稳定的低延迟. ...

  5. day06-静态资源访问&Rest风格

    SpringBoot之静态资源访问&REST风格请求 1.SpringBoot静态资源访问 1.1基本介绍 只要静态资源是放在类路径下的:/static./public./resources. ...

  6. Java里if和else的用法

    前言 在上一篇文章中,壹哥给大家讲解了Java里的输入与输出语句,现在你知道怎么用了吗?接下来我们继续往下学习Java里的流程控制语句,今天先给大家讲一下if和else这一对好基友,这个知识点可以说是 ...

  7. Salesforce Sharing And Visibility 零基础学习(一)基础知识篇

    本篇参考: https://trailhead.salesforce.com/en/users/strailhead/trailmixes/architect-sharing-and-visibili ...

  8. MySQL 一致性视图(MVCC)

    更多内容,前往IT-BLOG MySQL中支持的四种隔离级别 提到事务,你肯定会想到 ACID(Atomicity.Consistency.Isolation.Durability,即原子性.一致性. ...

  9. 对比 elasticsearch 和 mysql

    最近阅读了elasticsearch的官方文档,学习了它的很多特性,发现elasticsearch和mysql有很多地方类似,也有很多地方不同.这里做一个对比,帮助大家加深对elasticsearch ...

  10. mysql根据多列去除重复数据bing 并保留id最小的一项

    首先我的数剧是这样的: 我想根据name1.relation和name2判断如果重复的话删除重复的数据且保留id最小的一条数据,于是写了下面的sql语句 DELETE FROM star_relati ...