博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Word Ladder 单词爬梯
阅读量:6279 次
发布时间:2019-06-22

本文共 2062 字,大约阅读时间需要 6 分钟。

Word Ladder

Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformation sequence from beginWord to endWord,

such that:

Only one letter can be changed at a time Each intermediate word must exist in the dictionary For example,

Given: start = "hit" end = "cog" dict = ["hot","dot","dog","lot","log"] As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog", return its length 5.

Note: Return 0 if there is no such transformation sequence. All words have the same length. All words contain only lowercase alphabetic characters.

广度优先搜索

复杂度

时间 O(N) 空间 O(N)

思路

因为要求最短路径,如果我们用深度优先搜索的话必须遍历所有的路径才能确定哪个是最短的,而用广度优先搜索的话,一旦搜到目标就可以提前终止了,而且根据广度优先的性质,我们肯定是先通过较短的路径搜到目标。另外,为了避免产生环路和重复计算,我们找到一个存在于字典的新的词时,就要把它从字典中移去。这么做是因为根据广度优先,我们第一次发现词A的路径一定是从初始词到词A最短的路径,对于其他可能再经过词A的路径,我们都没有必要再计算了。

代码

public class Solution {    public int ladderLength(String beginWord, String endWord, Set
wordDict) { Queue
queue = new LinkedList
(); // step用来记录跳数 int step = 2; queue.offer(beginWord); while(!queue.isEmpty()){ int size = queue.size(); // 控制size来确保一次while循环只计算同一层的节点,有点像二叉树level order遍历 for(int j = 0; j < size; j++){ String currWord = queue.poll(); // 循环这个词从第一位字母到最后一位字母 for(int i = 0; i < endWord.length(); i++){ // 循环这一位被替换成25个其他字母的情况 for(char letter = 'a'; letter <= 'z'; letter++){ StringBuilder newWord = new StringBuilder(currWord); newWord.setCharAt(i, letter); if(endWord.equals(newWord.toString())){ return step; } else if(wordDict.contains(newWord.toString())){ wordDict.remove(newWord.toString()); queue.offer(newWord.toString()); } } } } step++; } return 0; }}

转载地址:http://qtfva.baihongyu.com/

你可能感兴趣的文章
Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)
查看>>
dataguard dubugs
查看>>
利用httpclient和多线程刷訪问量代码
查看>>
白话经典算法系列之中的一个 冒泡排序的三种实现
查看>>
控制台程序添加滚轮滑动支持
查看>>
POJ----(3974 )Palindrome [最长回文串]
查看>>
gridlaylout 简单布局
查看>>
WPF RadioButton 转换
查看>>
为什么使用 Bootstrap?
查看>>
在什么情况下使用struct,struct与class的区别
查看>>
STL源代码剖析(一) - 内存分配
查看>>
数据库update死锁
查看>>
http中使用json封装数据的性能测试
查看>>
开发ffmpeg/live555常见问题错误及解决方法
查看>>
appium跑demo简单实例讲解
查看>>
你能识别这些科技公司的真假logo吗?
查看>>
glibc的了解,对内核的封装
查看>>
Shell中的${},##和%%的使用
查看>>
Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入...
查看>>
提高夜晚学习效率的建议
查看>>