[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 }