Word Ladder

来源:互联网 发布:和程序员谈恋爱 编辑:程序博客网 时间:2024/05/29 17:29

Word Ladder


Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, 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.
Java代码:

public static int ladderLength(String start, String end, Set<String> dict) {if (start.equals(end))return 0;Queue<String> queue = new LinkedList<>();queue.offer(start);int min = Integer.MAX_VALUE;String tmp = queue.poll();for (String s : dict) {if (isNext(tmp, s)){if (s.equals(end))return 1;queue.offer(s);}}dict.remove(tmp);while (!queue.isEmpty()) {String tmp2 = queue.poll();int k = ladderLength(tmp2, end, dict);if (min > (k + 1))min = k + 1;}return min;}private static boolean isNext(String s1, String s2) {if (s1.length() == 0 || s2.length() == 0 || s1.length() != s2.length())return false;int len = s1.length();int count = 0;for (int i = 0; i < len; i++) {if (s1.charAt(i) != s2.charAt(i))count++;}return count == 1 ? true : false;}

运行测试之后,代码超时

参考代码如下;

public class Solution {    public static int ladderLength(String start, String end, HashSet<String> dict) {                         if (dict.size() == 0)                    return 0;                      LinkedList<String> wordQueue = new LinkedList<String>();              LinkedList<Integer> distanceQueue = new LinkedList<Integer>();                     wordQueue.add(start);              distanceQueue.add(1);                     while(!wordQueue.isEmpty()){                  String currWord = wordQueue.pop();                  Integer currDistance = distanceQueue.pop();                  if(currWord.equals(end)){                      return currDistance;                  }                  for(int i=0; i<currWord.length(); i++){                      char[] currCharArr = currWord.toCharArray();                      for(char c='a'; c<='z'; c++){                          currCharArr[i] = c;                                 String newWord = new String(currCharArr);                          if(dict.contains(newWord)){                              wordQueue.add(newWord);                              distanceQueue.add(currDistance+1);                              dict.remove(newWord);                          }                      }                  }              }                  return 0;          }  }

 

0 0
原创粉丝点击