1 解题思想
这道题的意思是,给了一个起始的单词,一个结束的单词,和一串词表
现在求从起始单词开始,每次选择词表中和起始单词仅有1个不同的单词,然后这个词再进行相同的操作,直到可以只改变一位得到结束的单词
这道题的解题方法就是BFS,而且有单向BFS和双向BFS两种,双向BFS似乎快不少,但是我没有实现。。我就说单向的
从起始的Word加入到队列当中
每次从队列中取出一个词,并加入词表中和他只差别一位且未使用的词
重复上述过程,直到当前取出的词可以一位变换到结束的词
这道题的一个坑就是BFS的时候,如果取出一个仅有一位不同的词,如果每次都是逐个对比,AC不了,而做法则是“手工的将当前的Word的每一位字符用a-z替换,再查词表包含与否,然后进行后续操作”
至于双向BFS,则是对结束Word也是用相同的过程,然后可以判断交集。。。不过这个虽然快,但是太复杂了,不值得太投入的写,就酱紫
2 原题
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.
3 AC解
public class Solution {
//计算两个字符的差异
private int calDiff(String currentWord,String endWord){
int diff = 0;
for(int i=0;i<currentWord.length();i++){
if(currentWord.charAt(i) != endWord.charAt(i)) diff++;
if(diff == 2) break;
}
return diff;
}
public int ladderLength(String beginWord, String endWord, Set<String> wordList) {
HashMap<String,Boolean> visited = new HashMap<String,Boolean>();
Queue<String> tmp = new LinkedList<String>();
Queue<Integer> steps = new LinkedList<Integer>();
tmp.add(beginWord);
steps.add(1);
// 采用BFS
while(tmp.isEmpty() == false){
String currentWord = tmp.poll();
char[] currentChars = currentWord.toCharArray();
int currentLen = steps.poll();
int diff = this.calDiff(currentWord,endWord);
// 首先判别能否直接变换到目标结果
if(diff < 2){
return diff + currentLen;
}
//直接替换每个位置的字符,然后进行比较
for(int i=0;i<currentWord.length();i++){
char mychar = currentChars[i];
for(char j='a';j<='z';j++){
if(mychar == j) continue;
currentChars[i] = j;
String nextString =new String(currentChars);
if(wordList.contains(nextString) && visited.containsKey(nextString) == false){
visited.put(nextString,true);
tmp.add(nextString);
steps.add(currentLen + 1);
}
currentChars[i] = mychar;
}
}
}
return 0;
}
}