题目:
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord toendWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
Return
[ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]同Word Ladder,但是要返回具体路径。
先采用bfs找出最短路径,并产生每个单词的前序节点。然后根据每个单词的前序节点,采用dfs生成最后的最短路径。
代码:
public class Solution {
List<List<String>> result;
Map<String,List<String>> map;
public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
if(wordList.size()==0)return result;
wordList.add(endWord);
result = new ArrayList<List<String>>();
map = new HashMap<String, List<String>>();
LinkedList<String> queue = new LinkedList<String>();
Map<String,Integer> map_level = new HashMap<String, Integer>();
for(String temp:wordList)
{
map_level.put(temp, Integer.MAX_VALUE);
}
map_level.put(beginWord, 1);
queue.add(beginWord);
int min = Integer.MAX_VALUE;
while(!queue.isEmpty())
{
String cur = queue.pop();
int level = map_level.get(cur)+1;
StringBuilder builder;
if(min<map_level.get(cur))break;
for(int i=0;i<cur.length();i++)
{
builder = new StringBuilder(cur);
for(int j='a';j<='z';j++)
{
builder.setCharAt(i, (char)j);
String temp = builder.toString();
if(wordList.contains(temp))
{
if(map_level.get(temp)<level)
{
continue;
}
else if(map_level.get(temp)>level)
{
queue.add(temp);
map_level.put(temp,level);
}
if(map.containsKey(temp))
{
map.get(temp).add(cur);
}
else
{
List<String> list = new LinkedList<String>();
list.add(cur);
map.put(temp, list);
}
if(temp.equals(endWord))
{
min=level;
}
}
}
}
}
List<String> list = new LinkedList<String>();
backTrace(endWord,beginWord,list);
return result;
}
private void backTrace(String word,String start,List<String> list){
if(word.equals(start))
{
list.add(0, word);
result.add(new LinkedList<String>(list));
list.remove(0);
return;
}
list.add(0,word);
if(map.get(word)!=null)
{
for(String temp:map.get(word))
{
backTrace(temp, start, list);
}
}
list.remove(0);
}
}