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. hdu1166 敌兵布阵 树状数组/线段树

    数列的单点修改.区间求和 树状数组或线段树入门题 #include<stdio.h> #include<string.h> ],N; void add(int x,int a) ...

  2. java泛型学习(1)

    java泛型(Generices Type) --->概念:泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和 ...

  3. 进程间通信--POSIX共享内存

    1.参考:https://www.cnblogs.com/Anker/archive/2013/01/19/2867696.html

  4. MySQL--区分表名大小写

    ============================================================================ 在MySQL中,可以通过lower_case_ ...

  5. knowledge-repo 知识管理简单试用

    knowledge-repo 是airbnb 开源的知识管理工具,只集成git 数据库等类型的存储 安装 pip install --upgrade "knowledge-repo[all] ...

  6. 引用,引用形參,指针形參与指向指针的引用形參,内存泄露及free相关

    (另:关于"引用"更具体的讨论.见此.) 由做UVa133引发的一系列问题及讨论 1.引用类型    C++ Primer P51 引用就是对象的还有一个名字,使用多个变量名指向同 ...

  7. 【python】格式化字符

    格式化字符串总结如下,红色部分是需要掌握部分: 以下几个常用的实例: 1.%s的使用 "%s is the author" %("paulwinflo")> ...

  8. poj 3069 Saruman's Army(贪心)

    Saruman's Army Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tot ...

  9. CentOS 6.4 添加永久静态路由所有方法汇总(原创)

    转摘,原文章地址:http://blog.sina.com.cn/s/blog_828e50020101ern5.html 查看路由的命令route -n CentOS添加永久静态路由 在使用双网卡, ...

  10. [UE4]运行时创建Actor