leetcode 84: Word Ladder
Word LadderFeb
11
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.
uncompleted
public class Solution {
private int _step = 0;
public int ladderLength(String start, String end, HashSet<String> dict) {
// Start typing your Java solution below
// DO NOT write main() function
int sz1 = start.length();
int sz2 = end.length();
if(sz1==0 || sz1!=sz2) return 0;
_step = Integer.MAX_VALUE;
if(start.equals(end) ) return 1;
else if(dict.isEmpty() ) return 0;
HashSet<String> temp = new HashSet<String>();
ladRec( start, end, dict, 0, temp);
return _step==Integer.MAX_VALUE ? 0 : _step+1;
}
private void ladRec(String start, String end, HashSet<String> dict, int level, HashSet<String> temp) {
if(start.equals( end) ) {
if(level<_step) _step=level;
return;
}
if( level >=_step ) return;
for(int i=0; i<start.length(); i++) {
if(start.charAt(i)!=end.charAt(i)) {
for(String str : findNext( start, i, dict) ){
if( !temp.contains( str ) ) {
temp.add( str );
ladRec(str, end, dict, i+1,temp);
temp.remove(temp.size() );
}
}
}
}
}
private ArrayList<String> findNext( String start, int i, HashSet<String> dict) {
ArrayList<String> res = new ArrayList<String>();
StringBuilder sb = new StringBuilder(start);
for( char c = 'a'; c<='z';c++) {
sb.setCharAt(i, c);
if( dict.contains(sb.toString())){
res.add( sb.toString() );
}
}
return res;
}
}
public class Solution {
public int ladderLength(String start, String end, HashSet<String> dict) {
// Start typing your Java solution below
// DO NOT write main() function
int sz1 = start.length();
int sz2 = start.length();
int path = 0;
if(sz1 != sz2) return 0;
if(start.equals(end) ) return 2;
Queue<String> queue = new LinkedList<String>();
queue.offer( start );
HashSet<String> hitted = new HashSet<String>();
hitted.add(start);
int l1 = 1;
int l2 = 0;
//BFS
while( !queue.isEmpty() ) {
String s = queue.poll();
l1--;
HashSet<String> strs = nextStr(s,dict, hitted);
l2 += strs.size();
for(String str : strs ) {
if( str.equals( end ) ) {
return path+2;
} else {
queue.offer( str );
}
}
if(l1==0) {
++path;
l1=l2;
l2=0;
}
}
return 0;
}
private HashSet<String> nextStr(String s, HashSet<String> dict, HashSet<String> hitted) {
HashSet<String> strs = new HashSet<String>();
StringBuilder sb = new StringBuilder(s);
for(int i=0; i<s.length(); i++) {
for(char c='a'; c<='z'; c++) {
sb.setCharAt(i,c);
String t = sb.toString();
if( dict.contains( t ) && !hitted.contains( t) ) {
hitted.add( t);
strs.add( t );
}
}
}
return strs;
}
}public class Solution {
public int ladderLength(String start, String end, HashSet<String> dict) {
// Start typing your Java solution below
// DO NOT write main() function
int sz1 = start.length();
int sz2 = start.length();
int path = 0;
if(sz1 != sz2) return 0;
if(start.equals(end) ) return 2;
Queue<String> queue = new LinkedList<String>();
queue.offer( start );
HashSet<String> hitted = new HashSet<String>();
hitted.add(start);
int l1 = 1;
int l2 = 0;
//BFS
while( !queue.isEmpty() ) {
String s = queue.poll();
l1--;
HashSet<String> strs = nextStr(s,dict, hitted);
l2 += strs.size();
for(String str : strs ) {
if( str.equals( end ) ) {
return path+2;
} else {
queue.offer( str );
}
}
if(l1==0) {
++path;
l1=l2;
l2=0;
}
}
return 0;
}
private HashSet<String> nextStr(String s, HashSet<String> dict, HashSet<String> hitted) {
HashSet<String> strs = new HashSet<String>();
for(int i=0; i<s.length(); i++) {
StringBuilder sb = new StringBuilder(s);
for(char c='a'; c<='z'; c++) {
sb.setCharAt(i,c);
String t = sb.toString();
if( dict.contains( t ) && !hitted.contains( t) ) {
hitted.add( t);
strs.add( t );
}
}
}
return strs;
}
}
浙公网安备 33010602011771号