F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[Leetcode] Word Ladder I,II

一、问题描述:

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.

二、实际上这里是广度优先搜索,需要记录遍历的层数,因此需要记录已经访问过的节点,这里使用set进行标记。

1、我们可以另外使用一个set来进行标记,也就是将访问过的节点放到一个set当中,在[1]当中作者利用了传入的参数set,但是对set进行了修改(当访问了一个word之后,将其从set当中删除,当再次遇到这个节点的时候由于它已经不在字典当中,所以无需再次访问)。由于对传入的数据进行了修改,我觉得第二种方法是不好的。

2、如何记录每一层,可以使用类似 binary tree level order travelsal 当中的方法,在每一层进行遍历之前,首先检查queue当中的节点的个数size,如果在这一层只需从队列当中出列size个元素即可,剩下的元素实际上是下一层的元素,需要在下一层当中进行访问。

我的代码如下:

 1 import java.util.*;
 2 
 3 public class Solution {
 4     public int ladderLength(String beginWord, String endWord, Set<String> wordDict) {
 5             Set<String> set = new HashSet<String>();
 6             Queue<String> queue=new LinkedList<String>();
 7             queue.add(beginWord);
 8             set.add(beginWord);
 9             int level=1;
10             while(!queue.isEmpty()){
11                 level++;
12                 int size = queue.size();
13                 for(int ii=0;ii<size;ii++){
14                     String wordone=queue.poll();
15                     StringBuffer wordonebuffer = new StringBuffer(wordone);
16                     for(int i=0;i<wordone.length();i++){//for each index
17                         char originalchar=wordonebuffer.charAt(i);
18                         for(char c='a';c<='z';c++){//for each substitute
19                             wordonebuffer.setCharAt(i,c);
20                             String tmpstring=wordonebuffer.toString();//toString is time consuming, do this operation once
21                             if(set.contains(tmpstring)) 
22                                 continue;
23                             else {
24                                 if(tmpstring.compareTo(endWord)==0){//reach the end
25                                     return level;
26                                 }
27                                 if(wordDict.contains(tmpstring)){//if not the word in dictionary, do not need to add into the wait queue
28                                     queue.add(tmpstring);
29                                     set.add(tmpstring);
30                                 }
31                             }
32                         }
33                         wordonebuffer.setCharAt(i,originalchar);
34                     }
35                 }
36             }
37             return 0;
38     }
39 }

 

posted on 2015-08-16 11:00  F_G  阅读(239)  评论(0编辑  收藏  举报