Word Ladder
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
- Only one letter can be changed at a time
- 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.
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 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;
}
}
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;
}
}