leetcode127
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的更多相关文章
- LeetCode127:Word Ladder II
题目: Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) ...
- [Swift]LeetCode127. 单词接龙 | Word Ladder
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...
- 【1】【leetcode-127】单词接龙word-ladder
(不会,经典广度优先搜索) 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改 ...
随机推荐
- hdu2084 数塔 DP
数字三角形,DP裸题 #include<stdio.h> #include<string.h> #define max(a,b) (a)>(b)?a:b ][],dp[] ...
- CUDA npp运动检测模块性能测试
测试环境: Cpu: Intel(R)Core(TM)i7-4790 CPU @3.6GHZ GPU: NVIDIA GeForce GTX960 *2 操作系统: Wi ...
- leetcode:Palindrome Number【Python版】
一次AC 题目要求中有空间限制,因此没有采用字符串由量变向中间逐个对比的方法,而是采用计算翻转之后的数字与x是否相等的方法: class Solution: # @return a boolean d ...
- Tcp 编程 的时代 已经到来
这是 一个 网友 在 Github 上的 项目 SmartRoute : https://github.com/IKende/SmartRoute ZooKeeper 和 Consul 的 “投票 ...
- Spring boot 使用的注解有哪些?
Spring boot 使用的注解有哪些? 注解 作用 @SpringBootApplication 等价于 @Configuration + @EnableAutoConfiguration + @ ...
- 完美解决IE9浏览器出现的对象未定义问题
目前Window7的机器上,使用IE9浏览器的用户很多,但是IE9在兼容性上做了较严格的控制,导致很多程序在chrome,firefox,ie6,ie7,ie8上可以正常运行,在ie9上确出现了各种问 ...
- python3 urllib
1.获取页面内容 第一种方式: import urllib.request url = 'https://www.baidu.com/' r = urllib.request.urlopen(url) ...
- python接口自动化20-requests获取响应时间(elapsed)与超时(timeout)
前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...
- monkey亲测
打开终端: adb devices 查看链接的设备 adb shell 进入手机系统 ls data/data 进入手机目录查看要执行目标app的包名 adb -s emulator-(机器名) s ...
- 【Unix网络编程】chapter6 IO复用:select和poll函数
chapter6 6.1 概述 I/O复用典型使用在下列网络应用场合. (1):当客户处理多个描述符时,必须使用IO复用 (2):一个客户同时处理多个套接字是可能的,不过不叫少见. (3):如果一个T ...