一开始想用Dijkstra求出beginWord到wordList里面所有词的最短路径,然后再看endWord是否和wordList里面某个词相同或者相差1个字母。
结果TLE:
public class Solution {
public int diffCharNum(String word1, String word2){
if (word1.length() != word2.length())
return Integer.MAX_VALUE;
int count = 0;
for (int i = 0; i < word1.length(); i ++){
if (word1.charAt(i) != word2.charAt(i))
count ++;
}
return count;
}
public int ladderLength(String beginWord, String endWord, Set<String> wordList) {
Set<String> s = new HashSet<String>();
HashMap<String, Integer> dist = new HashMap<String, Integer>();
for (String word : wordList){
if (diffCharNum(beginWord, word) == 1){
dist.put(word, 1);
}else{
dist.put(word, Integer.MAX_VALUE);
}
}
int distMin = Integer.MAX_VALUE;
String wordMin="";
while(!wordList.isEmpty()){
distMin = Integer.MAX_VALUE;
for (String word : wordList){
if (dist.get(word) < distMin){
distMin = dist.get(word);
wordMin = word;
}
}
if (distMin == Integer.MAX_VALUE){
break;
}
s.add(wordMin);
wordList.remove(wordMin);
for (String word : wordList){
if (diffCharNum(wordMin, word) == 1 && dist.get(wordMin) + 1 < dist.get(word)){
dist.put(word, dist.get(wordMin) + 1);
}
}
}
distMin = Integer.MAX_VALUE;
for (String word : s){
if (diffCharNum(word, endWord) == 1 && dist.get(word) != Integer.MAX_VALUE && dist.get(word) + 1 < distMin){
distMin = dist.get(word) + 1;
} else if (diffCharNum(word, endWord) == 0 && dist.get(word) != Integer.MAX_VALUE && dist.get(word) < distMin){
distMin = dist.get(word);
}
}
return distMin == Integer.MAX_VALUE ? 0 : distMin + 1;
}
}
改进方法: