码迷,mamicode.com
首页 > 编程语言 > 详细

[LeetCode][Java] Word Ladder

时间:2015-07-28 16:00:34      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:leetcode   java   word ladder   

题目:

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

  1. Only one letter can be changed at a time
  2. 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.

题意:

给定两个单词(开始单词 和 结束单词)和一个字典。找出从开始单词到结束单词最短的转换序列的长度。

注意:

    1. 每次只能改变一个字母。

    2. 每一个中间的单词必须是字典中的。

例如:

给定:

start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

其中一个最短的转化为"hit" -> "hot" -> "dot" -> "dog" -> "cog",

返回的长度为5.

注意:

     1.如果不存在该转化序列,就返回0.

     2.所有的单词具有相等的长度.

     3.所有的单词都是小写.

算法分析:

    

    这道题是套用BFS同时也利用BFS能寻找最短路径的特性来解决问题。


    把每个单词作为一个node进行BFS。当取得当前字符串时,对他的每一位字符进行从a~z的替换,如果在字典里面,就入队,并将下层count++,并且为了避免环路,需把在字典里检测到的单词从字典里删除。这样对于当前字符串的每一位字符安装a~z替换后,在queue中的单词就作为下一层需要遍历的单词了。

    正因为BFS能够把一层所有可能性都遍历了,所以就保证了一旦找到一个单词equals(end),那么return的路径肯定是最短的。
 
    ---类似于层序遍历二叉树,找到最先遍历到的叶子的层数就是树的最小高度;在该题中BFS遍历找到的第一个匹配就是最短转换,
    逐层挨个遍历,第一次遍历到的结束节点,当然是最短的路径

AC代码:

<span style="font-family:Microsoft YaHei;font-size:12px;">public class Solution 
{
    public int ladderLength(String start, String end, Set<String> dict) 
    {
        if(start==null || end==null || start.length()==0 || end.length()==0 || start.length()!=end.length())  
        return 0; 
        
        LinkedList<String> wordQueue = new LinkedList<String>();
        int level = 1; //定义当前的层级
        int curnum = 1;//定义当前层的节点数
        int nextnum = 0;//定义下一层的节点数
        
        wordQueue.add(start);
        
        while(!wordQueue.isEmpty())
        {
            String word = wordQueue.poll();
            curnum--;
            
            for(int i = 0; i < word.length(); i++)
            {
                char[] wordunit = word.toCharArray();
                for(char j = 'a'; j <= 'z'; j++)
                {
                    wordunit[i] = j;
                    String temp = new String(wordunit);  
                    
                    if(temp.equals(end))
                        return level+1;
                    if(dict.contains(temp))
                    {
                        wordQueue.add(temp);
                        nextnum++;
                        dict.remove(temp);
                    }
                }
            }
            
            if(curnum == 0)//说明该层访问结束,需要进入下一层
            {
                curnum = nextnum;
                nextnum = 0;
                level++;
            }
        }
        
        return 0;
    }
}</span>

版权声明:本文为博主原创文章,转载注明出处

[LeetCode][Java] Word Ladder

标签:leetcode   java   word ladder   

原文地址:http://blog.csdn.net/evan123mg/article/details/47105721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!