Input:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
Output: 5
Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.
public int ladderLength(String beginWord,String endWord,List<String> wordList){
wordList.add(beginWord);
int start = wordList.size()-1;
int end = 0;
while(end<wordList.size()&& !wordList.get(end).equals(end)){
end++;
}
if (end == wordList.size()){
return 0;
}
List<Integer>[] graphic = buildGraphic(wordList);
return getShortestPath(graphic,start,end);
}
private List<Integer>[] buildGraphic(List<String> wordList){
int N = wordList.size();
List<Integer>[] graphic = new List[N];
for(int i=0;i<N;i++){
graphic[i] = new ArrayList<Integer>();
for(int j=0;j<N;j++){
if(isConnect(wordList.get(i),wordList.get(j))){
graphic[i].add(j);
}
}
}
return graphic;
}
private boolean isConnect(String s1,String s2){
int diffCnt = 0;
for(int i=0;i<s1.length()&&diffCnt<=1;i++){
if(s1.charAt(i)!=s2.charAt(i)){
diffCnt++;
}
}
return diffCnt == 1;
}
private int getShortestPath(List<Integer>[] graphic,int start,int end){
Queue<Integer> queue = new LinkedList<Integer>();
boolean[] marked = new boolean[graphic.length];
queue.add(start);
marked[start] = true;
int path = 1;
while(!queue.isEmpty()){
int size = queue.size();
path++;
while(size-->0){
int cur = queue.poll();
for(int next:graphic[cur]){
if(next == end){
return path;
}
if(marked[next]){
continue;
}
marked[next] = true;
queue.add(next);
}
}
}
return 0;
}