解题思路:
首先将所有的单词映射为一张map:其中键是每一个单词,值是一个数组,对应和这个单词只差一个字母的所有的单词;然后利用BFS找到一条最短路径。
时间复杂度:O(n)
提交代码:
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
if(!wordList.contains(endWord)) return 0;
// create the wordLadder map
Map<String,List<String>> map=new HashMap<>();
Queue<String> q1=new LinkedList<>();
Queue<String> q2=new LinkedList<>();
q1.add(endWord);
wordList.remove(endWord);
wordList.add(beginWord);
while(q1.size()>0) {
while(q1.size()>0) {
List<String> list=new ArrayList<>();
String tmp1=q1.poll();
for(int i=0;i<wordList.size();i++) {
String tmp2=wordList.get(i);
if(isNeighbor(tmp1,tmp2)) {
list.add(tmp2);
q2.add(tmp2);
wordList.remove(tmp2);
i--;
}
}
map.put(tmp1, list);
}
q1.addAll(q2);
q2.clear();
}
// find the ladder by BFS
int len=1;
Set<String> set1=new HashSet<String>();
Set<String> set2=new HashSet<String>();
set1.addAll(map.get(endWord));
while(set1.size()>0) {
len++;
for(String str : set1) {
if(str.equals(beginWord)) return len;
set2.addAll(map.get(str));
}
set1.clear();
set1.addAll(set2);
set2.clear();
}
return 0;
}
private boolean isNeighbor(String s1,String s2) {
int cnt=0;
for(int i=0;i<s1.length();i++) {
if(s1.charAt(i)!=s2.charAt(i)) {
cnt++;
if(cnt>1) return false;
}
}
if(cnt==0) return false;
return true;
}
}
运行结果: