解题思路:
以下面这个例子进行说明:
Input:
beginWord = “hit”,
endWord = “cog”,
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
Output:
[
[“hit”,“hot”,“dot”,“dog”,“cog”],
[“hit”,“hot”,“lot”,“log”,“cog”]
]
首先我们使用BFS将这些词搭成一颗树:
然后我们将这个树做成map<String,List< String >>的格式,原因后面就明白了:
然后倒着从cog开始往前找:
这里可以得到:cog-log-lot-hot-hit
同理可以得到:cog-dog-dot-hot-hit
但是这样倒着查写代码不方面,所以我们改变一下这个图的结构,从最后目标单词cog开始统计键和值:
这样看起来方便多了:
可以得到cog-dog-dot-hot-hit,倒过来就是我们要的结果
同理可得cog-log-lot-hot-hit,倒过来就是我们要的另外一个ladder
提交代码:
class Solution{
public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
List<List<String>> results=new ArrayList<List<String>>();
if(!wordList.contains(endWord)) return results;
wordList.remove(endWord);wordList.add(beginWord);
// build the tree
Map<String,List<String>> tree=buildTree(endWord,wordList);
// find the path
List<String> res=new ArrayList<String>();
res.add(endWord);
findPath(endWord,beginWord,tree,res,results);
return results;
}
private Map<String,List<String>> buildTree(String beginWord,List<String> wordList) {
Map<String,List<String>> tree=new HashMap<>();
//initialize the tree
tree.put(beginWord, new ArrayList<String>());
for(String str: wordList)
tree.put(str, new ArrayList<String>());
Queue<String> q1=new LinkedList<>();
q1.offer(beginWord);
while(q1.size()!=0&&wordList.size()!=0) {
List<String> delList=new ArrayList<String>();
Queue<String> q2=new LinkedList<>();
// add sons
while(q1.size()!=0) {
String tmp=q1.poll();
for(int i=0;i<wordList.size();i++) {
if(isSon(tmp,wordList.get(i))) {
tree.get(tmp).add(wordList.get(i));
if(!q2.contains(wordList.get(i))){
q2.offer(wordList.get(i));
}
delList.add(wordList.get(i));
}
}
}
// delete the used values
for(int i=0;i<delList.size();i++)
wordList.remove(delList.get(i));
q1=q2;
}
return tree;
}
private boolean isSon(String A,String B) {
int cnt=0;
for(int i=0;i<A.length();i++) {
if(A.charAt(i)!=B.charAt(i)) {
cnt++;
if(cnt==2) return false;
}
}
if(cnt==0) return false;
return true;
}
private void findPath(String start,String end,Map<String,List<String>> tree,
List<String> res,List<List<String>> results) {
List<String> curSons=tree.get(start);
if(curSons.size()==0) return;
for(int i=0;i<curSons.size();i++) {
res.add(curSons.get(i));
if(curSons.get(i).equals(end)) {
List<String> tmp=new ArrayList<String>();
for(int j=res.size()-1;j>=0;j--)
tmp.add(res.get(j));
results.add(tmp);
res.remove(curSons.get(i));
return;
}
findPath(curSons.get(i),end,tree,res,results);
res.remove(curSons.get(i));
}
}
}
运行结果: