难度:中等 题目来源:力扣(LeetCode) https://leetcode-cn.com/problems/word-ladder

    说明:
    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:

    1. 每次转换只能改变一个字母。
    2. 转换过程中的中间单词必须是字典中的单词。

    注:

    • 如果不存在这样的转换序列,返回 0。
    • 所有单词具有相同的长度。
    • 所有单词只由小写字母组成。
    • 字典中不存在重复的单词。
    • 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

    示例:
    示例 1:

    输入: beginWord = “hit”, endWord = “cog”,

    wordList = [“hot”,”dot”,”dog”,”lot”,”log”,”cog”]

    输出: 5

    解释: 一个最短转换序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”,

    1. 返回它的长度 5

    示例 2:

    输入:

    beginWord = “hit”

    endWord = “cog”

    wordList = [“hot”,”dot”,”dog”,”lot”,”log”]

    输出: 0

    解释: endWord “cog” 不在字典中,所以无法进行转换。

    解法:

    1. import "container/list"
    2. func ladderLength(beginWord string, endWord string, wordList []string) int {
    3. wordLen, comoboDict := len(beginWord), make(map[string][]string, len(wordList)*3)
    4. for _, word := range wordList {
    5. index := 0
    6. for index < wordLen {
    7. key := word[0:index] + "*" + word[index+1:]
    8. comoboDict[key] = append(comoboDict[key], word)
    9. index++
    10. }
    11. }
    12. level := 0
    13. queue := list.New()
    14. queue.PushBack(interface{}(beginWord))
    15. visited := make(map[string]bool, len(wordList))
    16. for queue.Len() > 0 {
    17. level++
    18. queueIndex, queueCount := 0, queue.Len()
    19. for queueIndex < queueCount {
    20. queueIndex++
    21. word := queue.Remove(queue.Front()).(string)
    22. if visited[word] {
    23. continue
    24. }
    25. if word == endWord {
    26. return level
    27. }
    28. visited[word] = true
    29. wordIndex := 0
    30. for wordIndex < wordLen {
    31. key := word[0:wordIndex] + "*" + word[wordIndex+1:]
    32. wordIndex++
    33. words, exist := comoboDict[key]
    34. if !exist {
    35. continue
    36. }
    37. for _, value := range words {
    38. if value != word && !visited[value] {
    39. queue.PushBack(interface{}(value))
    40. }
    41. }
    42. }
    43. }
    44. }
    45. return 0
    46. }