leetcode JAVA Word Ladder 3.44 难度系数3
2014-02-11 00:56
302 查看
Question:
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 =
end =
dict =
As one shortest transformation is
return its length
Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.
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 class Solution { public int ladderLength(String start, String end, HashSet<String> dict) { int path = 0; Queue<String> queue = new LinkedList<String>(); queue.offer(start); HashSet<String> hs = new HashSet<>(); hs.add(start); int length1 = 1; int length2 = 0; while(!queue.isEmpty()){ String s = queue.poll(); length1--; HashSet<String> hsstr = nextStr(s,dict,hs); length2 +=hsstr.size(); for(String str:hsstr){ if(str.equals(end)){ return path+2; }else{ queue.offer(str); } } if(length1==0){ path++; length1=length2; length2 = 0; } } return 0; } private HashSet<String> nextStr(String s, HashSet<String> dict, HashSet<String> hs) { HashSet<String> hsstr = new HashSet<>(); for(int i=0;i<s.length();i++){ StringBuffer sb = new StringBuffer(s); for(char c='a';c<='z';c++){ sb.setCharAt(i,c); String temp = sb.toString(); if(dict.contains(temp)&&!hs.contains(temp)){ hs.add(temp); hsstr.add(temp); } } } return hsstr; } }