Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["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.
由于现做的126题,所以这道题其实只用BFS就可以了。
用126的答案。
public class Solution { public int ladderLength(String beginWord, String endWord, Set<String> wordList) { if( beginWord == null || beginWord.length() == 0 || wordList.size() == 0 || beginWord.length() != endWord.length() ) return 0; return BFS(beginWord,endWord,wordList); } public int BFS(String beginWord,String endWord,Set<String> wordList){ Queue queue = new LinkedList<String>(); queue.add(beginWord); int result = 1; while( !queue.isEmpty() ){ String str = (String) queue.poll(); if( str.equals(endWord) ) continue; for( int i = 0 ;i <beginWord.length();i++){ char[] word = str.toCharArray(); for( char ch = 'a';ch<='z';ch++) { word[i] = ch; String Nword = new String(word); if ( wordList.contains(Nword)) { if (!map.containsKey(Nword)) { map.put(Nword, (int) map.get(str) + 1); queue.add(Nword); } } if( Nword.equals(endWord) ) return (int) map.get(str) + 1; } } } return 0; } }
去掉map,会快一些。
public class Solution { public int ladderLength(String beginWord, String endWord, Set<String> wordList) { if( beginWord == null || beginWord.length() == 0 || wordList.size() == 0 || beginWord.length() != endWord.length() ) return 0; Queue queue = new LinkedList<String>(); queue.add(beginWord); int result = 1; while( ! queue.isEmpty() ){ int len = queue.size(); for( int i = 0;i<len;i++){ String str = (String) queue.poll(); for( int ii = 0; ii < str.length();ii++){ char[] word = str.toCharArray(); for( char ch = 'a'; ch<='z';ch++){ word[ii] = ch; String newWord = new String(word); if( wordList.contains(newWord) ){ wordList.remove(newWord); queue.add(newWord); } if( newWord.equals(endWord) ) return result+1; } } } result++; } return 0; } }
还有更快的做法,一般是前后一起建立队列来做,会快很多。