剑指OfferII108.单词演变

题目

在字典(单词列表) wordList 中,从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:

序列中第一个单词是 beginWord 。

序列中最后一个单词是 endWord 。

每次转换只能改变一个字母。

转换过程中的中间单词必须是字典 wordList 中的单词。

给定两个长度相同但内容不同的单词 beginWord 和 endWord 和一个字典 wordList ,

找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。

示例 1:输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] 输出:5

解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。

示例 2:输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"] 输出:0

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

提示:1 <= beginWord.length <= 10

endWord.length == beginWord.length

1 <= wordList.length <= 5000

wordList[i].length == beginWord.length

beginWord、endWord 和 wordList[i] 由小写英文字母组成

beginWord != endWord

wordList 中的所有字符串 互不相同

注意:本题与主站 127 题相同:

解题思路分析

1、广度优先搜索;时间复杂度O(n^2),空间复杂度O(n^2)

func ladderLength(beginWord string, endWord string, wordList []string) int {
   m := make(map[string]int)
   for i := 0; i < len(wordList); i++ {
      m[wordList[i]] = 1
   }
   if m[endWord] == 0 {
      return 0
   }
   preMap := make(map[string][]string)
   for i := 0; i < len(wordList); i++ {
      for j := 0; j < len(wordList[i]); j++ {
         newStr := wordList[i][:j] + "*" + wordList[i][j+1:]
         if _, ok := preMap[newStr]; !ok {
            preMap[newStr] = make([]string, 0)
         }
         preMap[newStr] = append(preMap[newStr], wordList[i])
      }
   }
   visited := make(map[string]bool)
   count := 0
   queue := make([]string, 0)
   queue = append(queue, beginWord)
   for len(queue) > 0 {
      count++
      length := len(queue)
      for i := 0; i < length; i++ {
         for j := 0; j < len(beginWord); j++ {
            newStr := queue[i][:j] + "*" + queue[i][j+1:]
            for _, word := range preMap[newStr] {
               if word == endWord {
                  return count + 1
               }
               if visited[word] == false {
                  visited[word] = true
                  queue = append(queue, word)
               }
            }
         }
      }
      queue = queue[length:]
   }
   return 0
}

2、广度优先搜索;时间复杂度O(n^2),空间复杂度O(n^2)

剑指OfferII108.单词演变

func ladderLength(beginWord string, endWord string, wordList []string) int {
   m := make(map[string]int)
   for i := 0; i < len(wordList); i++ {
      m[wordList[i]] = 1
   }
   if m[endWord] == 0 {
      return 0
   }
   queue := make([]string, 0)
   queue = append(queue, beginWord)
   count := 0
   for len(queue) > 0 {
      count++
      length := len(queue)
      for i := 0; i < length; i++ {
         for _, word := range wordList {
            diff := 0
            for j := 0; j < len(queue[i]); j++ {
               if queue[i][j] != word[j] {
                  diff++
               }
               if diff > 1 {
                  break
               }
            }
            if diff == 1 && m[word] != 2 {
               if word == endWord {
                  return count + 1
               }
               m[word] = 2
               queue = append(queue, word)
            }
         }
      }
      queue = queue[length:]
   }
   return 0
}

总结

Hard题目,题目同leetcode 127.单词接龙;类似的题目还有
leetcode 126.单词接龙II;
面试题17.22.单词转换

展开阅读全文

页面更新:2024-03-13

标签:单词   本题   复杂度   广度   接龙   示例   字符串   序列   数目   字典   字母   长度   题目   时间   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top