【leetcode】126.(Hard)Word Ladder II
阿新 • • 發佈:2018-12-18
解題思路:
以下面這個例子進行說明:
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));
}
}
}
執行結果: