126. Word Ladder II(bfs+dfs)

题目:

Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord toendWord, such that:

  1. Only one letter can be changed at a time
  2. 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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值