[LeetCode刷题] Word Ladder

看到挺多公司最近考这个,做了一下。这个代码大部分是他的,觉得特别不错就用了。自己加了一些comment,值得重新做一遍

public class Solution {
    public int ladderLength(String start, String end, Set<String> dict) {
        //edge case
        if(start == null || end == null || start.length() == 0 || end.length()== 0 || dict.size() == 0) {
            return 0;
        }
        int ladder = 2;
        LinkedList<String> queue = new LinkedList<String>();
        HashSet<String> visited = new HashSet<String>();
        //这里要注意,只要加入queue的就必须放入visited
        queue.offer(start);
        visited.add(start);
        //这个纪录level的方法不错。我之前是用null加到queue里面表示一个level,现在可以直接count每层的数量。每visited一次lastNum--,每add一个cur++, 然后当lastNum==0时,表示一层。curNum传给lastNum然后重新变为0
        int lastNum = 1;  
        int curNum = 0;  
        while(queue.size() != 0) {
            String cur = queue.poll();
            lastNum--;
            for(int l = 0 ; l < cur.length(); l++) {
                char[] curArray = cur.toCharArray();
                for(char c = 'a'; c <= 'z'; c++) {
                    //原来在想这里不需要看会不会与自己(cur)是同一个string吗,其实不怕,因为这个case只会visited一次
                    curArray[l] = c;
                    String curT = new String(curArray);
                    if(curT.equals(end)){
                        return ladder;
                    } else {
                      if(dict.contains(curT) && !visited.contains(curT)) {
                          curNum++;
                          queue.offer(curT);
                          visited.add(curT);
                      }  
                    }
                }
            }
            if(lastNum==0) {  
                lastNum = curNum;  
                curNum = 0;  
                ladder++;  
            } 
        }
        return 0;
    }
}
posted on 2015-03-30 12:00  Seth_L  阅读(126)  评论(0编辑  收藏  举报