package com.interview.books.leetcodeoj;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
/**
* Created_By: stefanie
* Date: 14-12-26
* Time: 下午9:58
*/
public class LOJ127_WordLadder {
//do Level-Order traverse on the generation process, each step only change only one char
//1. mark visited and check equals(end) when add into queue, not when poll from queue to avoid duplication element in queue.
//2. for edge case: if(start.equals(end)) return 1
//3. remember set char[i] = original after change char in position i
//4. remember to length++ when after visit one layer.
public int ladderLength(String start, String end, Set<String> dict) {
if(start.equals(end)) return 1;
Queue<String> queue = new LinkedList();
Set<String> visited = new HashSet();
queue.offer(start);
visited.add(start);
int length = 1;
while(!queue.isEmpty()){
int levelSize = queue.size();
for(int k = 0; k < levelSize; k++){
String word = queue.poll();
char[] chars = word.toCharArray();
for(int i = 0; i < chars.length; i++){
char original = chars[i];
for(char ch = 'a'; ch <= 'z'; ch++){
if(ch == original) continue;
chars[i] = ch;
String next = String.valueOf(chars);
if(!visited.contains(next) && dict.contains(next)){
if(next.equals(end)) return length + 1;
queue.offer(next);
visited.add(next);
}
}
chars[i] = original;
}
}
length++;
}
return 0;
}
}