1 public class Solution {
2 public int ladderLength(String beginWord, String endWord, Set<String> wordList) {
3 if(!isValidParam(beginWord, endWord, wordList)) {
4 return 0;
5 } else if(beginWord.equals(endWord)) {
6 return 1;
7 }
8
9 Set<String> visited = new HashSet<>();
10 LinkedList<String> currLevel = new LinkedList<>();
11 LinkedList<String> nextLevel = new LinkedList<>();
12 int cnt = 1;
13 currLevel.offer(beginWord);
14 visited.add(beginWord);
15
16 while(currLevel.size() > 0) {
17 for(String word: currLevel) {
18 StringBuilder buff = new StringBuilder(word);
19 for(int i = 0; i < buff.length(); i++) {
20 char currChar = buff.charAt(i);
21 for(char c = 'a'; c <= 'z'; c++) {
22 buff.setCharAt(i, c);
23 String tmpWord = buff.toString();
24
25 // found the endWord
26 if(endWord.equals(tmpWord)) {
27 return cnt + 1;
28 }
29
30 if(visited.contains(tmpWord) || !wordList.contains(tmpWord)) {
31 continue;
32 } else {
33 visited.add(tmpWord);
34 nextLevel.add(tmpWord);
35 }
36 }
37 buff.setCharAt(i, currChar);
38 }
39 }
40 currLevel = nextLevel;
41 nextLevel = new LinkedList<String>();
42 cnt++;
43 }
44
45 return 0;
46 }
47
48 private boolean isValidParam(String beginWord, String endWord, Set<String> dict) {
49 boolean isValid = true;
50 if(beginWord == null || endWord == null || beginWord.length() != endWord.length()) {
51 isValid = false;
52 }
53 if(dict == null || dict.size() == 0) {
54 isValid = false;
55 }
56 return isValid;
57 }
58 }