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

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84939525