1. 程式人生 > >【leetcode】126.(Hard)Word Ladder II

【leetcode】126.(Hard)Word Ladder II

解題思路:
以下面這個例子進行說明:

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)); } } }

執行結果:
在這裡插入圖片描述