class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
HashSet<String> wordSet = new HashSet<>(wordList); //替换掉题目中List结构,加速查找
if (!wordSet.contains(endWord)) return 0; //如果目标顶点不在图中,直接返回0
HashMap<String, Integer> map = new HashMap<>(); //用来存储已访问的节点,并存储其在路径上的位置,相当于BFS算法中的isVisted功能
Queue<String> q = new LinkedList<>(); //构建队列,实现广度优先遍历
q.add(beginWord); //加入源顶点
map.put(beginWord, 1); //添加源顶点为“已访问”,并记录它在路径的位置
while (!q.isEmpty()) { //开始遍历队列中的顶点
String word = q.poll(); //记录现在正在处理的顶点
int level = map.get(word); //记录现在路径的长度
for (int i = 0; i < word.length(); i++) {
char[] wordLetter = word.toCharArray();
for (char j = 'a'; j <= 'z'; j++) {
if (wordLetter[i] == j) continue;
wordLetter[i] = j; //对于每一位字母,分别替换成另外25个字母
String check = new String(wordLetter);
if (check.equals(endWord)) return map.get(word) + 1; //如果已经抵达目标节点,返回当前路径长度+1
if (wordSet.contains(check) && !map.containsKey(check)) { //如果字典中存在邻接节点,且这个邻接节点还未被访问
map.put(check, level + 1); //标记这个邻接节点为已访问,记录其在路径上的位置
q.add(check); //加入队列,以供广度搜索
}
}
}
}
return 0;
}
}

数据结构:
HashSet<String> wordSet 实用hash存储第三个参数单词字典,加速查找

HashMap<String, Integer> map 存储已经访问过的节点,相当于visited

LinkedList<Object> q 主循环判断的Stack

算法流程:
q中添加源单词,同时在map中添加此单词,表示已占用
循环q
  取出q中的栈顶的值(poll) -> word (map中仍然占用)
  查询栈的深度 -> level
  循环word中每一个字符
    找到一个合理的匹配 ->check
    判断check是否是目标单词
      是:返回 level + 1
      不是:将check加入q,并在map中锁定check
循环完毕,所有在单词列表中的词都被锁定,无法添加进入q,则返回0,表示未找到

补充一个python的实现:

 class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: 'List[str]') -> int:
wordset = set(wordList)
if endWord not in wordset:
return 0
alpher = ['a','b','c','d','e','f','g',
'h','i','j','k','l','m','n',
'o','p','q','r','s','t',
'u','v','w','x','y','z']
wordmap = {}
q = []
q.append(beginWord)
wordmap[beginWord] = 1
while len(q) > 0:
n = len(q)
temp = []
while n > 0:
n -= 1
word = q.pop()
level = wordmap[word]
for i in range(len(word)):
for j in range(len(alpher)):
if word[i] == alpher[j]:
continue
check = word[:i] + alpher[j] + word[i+1:]
if check == endWord:
return level + 1
#minLength = min(minLength,level + 1)
if check in wordset and check not in wordmap:
wordmap[check] = level + 1
temp.append(check)
if len(temp) > 0:
q = temp[:]
return 0

注意加粗部分的代码,与java的语法是有区别,主要是判断q是否为空。

leetcode127的更多相关文章

  1. LeetCode127:Word Ladder II

    题目: Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) ...

  2. [Swift]LeetCode127. 单词接龙 | Word Ladder

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...

  3. 【1】【leetcode-127】单词接龙word-ladder

    (不会,经典广度优先搜索) 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改 ...

随机推荐

  1. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop

    转载至:https://blog.csdn.net/wo541075754/article/details/75201934 no-loop 定义当前的规则是否不允许多次循环执行,默认是 false, ...

  2. Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  3. hasura graphql 集成pipelinedb测试

    实际上因为pipelinedb 是原生支持pg的,所以应该不存在太大的问题,以下为测试 使用doker-compose 运行 配置 docker-compose 文件 version: '3.6' s ...

  4. ThinkPHP 5 中的 composer.json

    本篇并不是揭 ThinkPHP 5 的问题. 只是通过 composer.json 来学习 compoer.json 元旦那天, ThinkPHP 5.1 正式发布,值得庆祝. 之后的第二天有人反馈 ...

  5. java中<load-on-startup>含义

    java中 load-on-startup 含义 java中的 load-on-startup 用于表示该servlet是否在servlet容器启动的时候加载. 示例: <load-on-sta ...

  6. 客户端用javascript获取grid的数据。

  7. 后台取IE的相关信息

    HttpBrowserCapabilities b = Request.Browser; Response.Write("浏览器名称和版本号:" + b.Type + " ...

  8. UOJ 188 【UR #13】Sanrd——min_25筛

    题目:http://uoj.ac/problem/188 令 \( s(n,j)=\sum\limits_{i=1}^{n}[min_i>=p_j]f(j) \) ,其中 \( min_i \) ...

  9. win10激活命令

    以管理员方式打开命令提示符输入以下3条命令slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX 按回车slmgr /skms 54.223.212.31 按回车slmgr ...

  10. java newInstance() 的参数版本与无参数版本详解

    newInstance() 的参数版本与无参数版本详解 博客分类: Core Java   通过反射创建新的类示例,有两种方式: Class.newInstance() Constructor.new ...