Lint Code 120. 单词接龙

虽然知道是使用bfs求树节点之间的最短路径问题但是还是码不出来,看的答案,失败,具体思路和二叉树的层次遍历近似

 

  1   2 
  3 import org.junit.Test;
  4 
  5 import java.util.*;
  6 
  7 public class LadderLength {
  8     /**
  9      * @param start: a string
 10      * @param end:   a string
 11      * @param dict:  a set of string
 12      * @return: An integer
 13      * <p>
 14      * 120. 单词接龙
 15      * 给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列
 16      * <p>
 17      * 比如:
 18      * <p>
 19      * 1.每次只能改变一个字母。
 20      * 2.变换过程中的中间单词必须在字典中出现。
 21      * 样例
 22      * 给出数据如下:
 23      * <p>
 24      * start = "hit"
 25      * <p>
 26      * end = "cog"
 27      * <p>
 28      * dict = ["hot","dot","dog","lot","log"]
 29      * <p>
 30      * 一个最短的变换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",
 31      * <p>
 32      * 返回它的长度 5
 33      * <p>
 34      * 注意事项
 35      * 如果没有转换序列则返回0。
 36      * 所有单词具有相同的长度。
 37      * 所有单词都只包含小写字母。
 38      * <p>
 39      * 求图的最短路径使用bfs
 40      */
 41     public int ladderLength(String start, String end, Set<String> dict) {
 42         // write your code here
 43         if (dict == null) {
 44             return 0;
 45         }
 46         if (start.equals(end)) {
 47             return 1;
 48         }
 49         //hashSet用于过滤已经使用的dict中的元素,防止再走一遍
 50         HashSet<String> hashSet = new HashSet<>();
 51         //queue中放每一层的节点
 52         LinkedList<String> linkedList = new LinkedList<>();
 53 
 54         hashSet.add(start);
 55         linkedList.add(start);
 56         //可能dict中没有end,但是会有end的上一步的word
 57         dict.add(end);
 58 
 59         //下面开始遍历一层中所有的next,想象成一颗二叉树的层次遍历
 60         int result = 1;
 61         while (!linkedList.isEmpty()) {
 62             //遍历的层数就是路径的长度
 63             result++;
 64             int layerSize = linkedList.size();
 65             for (int i = 0; i < layerSize; i++) {
 66                 String poll = linkedList.poll();
 67                 for (String nextWord : getNextWords(poll,dict)) {
 68                     if (hashSet.contains(nextWord)) {
 69                         continue;
 70                     }
 71                     if (nextWord.equals(end)) {
 72                         return result;
 73                     }
 74                     hashSet.add(nextWord);
 75                     linkedList.add(nextWord);
 76                 }
 77             }
 78         }
 79         return 0;
 80     }
 81 
 82     private String replace(String s, int index, char c) {
 83         char[] chars = s.toCharArray();
 84         chars[index] = c;
 85         return new String(chars);
 86     }
 87 
 88     private ArrayList<String> getNextWords(String word, Set<String> dict) {
 89         char[] chars = word.toCharArray();
 90         ArrayList<String> nextWords = new ArrayList<>();
 91         for (int j = 0; j < chars.length; j++) {
 92             for (char i = 'a'; i <= 'z'; i++) {
 93                 if (chars[j] == i) {
 94                     continue;
 95                 }
 96                 String nextString = replace(word, j, i);
 97                 if (dict.contains(nextString)) {
 98                     nextWords.add(nextString);
 99                 }
100             }
101         }
102         return nextWords;
103     }
104 
105     @Test
106     public void testGetNextWords() {
107         String word = "chen";
108         Set<String> dict = new HashSet<>();
109         dict.add("chea");
110         dict.add("cheb");
111         dict.add("chec");
112         dict.add("chan");
113         dict.add("chbn");
114         dict.add("chba");
115         dict.add("chca");
116         dict.add("cdca");
117 
118 //        ArrayList<String> nextWords = getNextWords(word, dict);
119 //        System.out.println(Arrays.toString(nextWords.toArray()));
120         System.out.println(ladderLength(word,"cdca",dict));
121     }
122 
123 }

 

posted @ 2018-09-02 16:44  wei1  阅读(205)  评论(0编辑  收藏  举报