leetCode练习(126)

本文介绍了一个复杂的问题——WordLadder II,即寻找从一个单词到另一个单词的最短转换序列,每次只能改变一个字母且每一步都要经过字典中存在的单词。通过双向BFS算法,并结合哈希映射来记录每个单词的前驱节点,最终利用回溯法找到了所有最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:Word Ladder

难度:hard

问题描述:

Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformation sequence(s) from beginWord to endWord, 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"]
  ]

Note:

  • All words have the same length.
  • All words contain only lowercase alphabetic characters.

问题描述:

测试案例属于短而巨多字符串。因此,在一开始使用DFS直接超时了额。于是想到继续用BFS,同时使用map记录每个字符串的前向节点。最后使用回溯找到所有的解。

代码如下:

public class h_126_WordLadderll {
	HashMap<String,List<String>> lastmap;
	public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
        //记录该Str的上一层节点
		lastmap=new HashMap<>();
		lastmap.put(endWord, new ArrayList<>());
		//记录该Str是哪一层
		HashMap<String,Integer> intmap=new HashMap<>();
		for(String w:wordList){
			intmap.put(w, Integer.MAX_VALUE);
		}
		intmap.put(endWord, Integer.MAX_VALUE);
		wordList.add(endWord);
		//BFS的queue
		Queue<String> queue=new ArrayDeque<>();
		queue.add(beginWord);
		int level=0;
		int min=Integer.MAX_VALUE;

		while(!queue.isEmpty()){
			int len=queue.size();//该层的节点数
			level++;
			if(level>min) break;
			for(int i=0;i<len;i++){
				String str=queue.poll();
				for(int j=0;j<str.length();j++){
					char[] cs=str.toCharArray();
					for(char c='a';c<='z';c++){
						cs[j]=c;
						String newstr=new String(cs);
						if(wordList.contains(newstr)){
							if(level<intmap.get(newstr)){
								queue.add(newstr);
								intmap.put(newstr, level);
							}else if(level>intmap.get(newstr)){ 
								continue;
							}
							if(lastmap.containsKey(newstr)){
								lastmap.get(newstr).add(str);
							}else{
								List<String> list= new LinkedList<String>();
								list.add(str);
								lastmap.put(newstr, list);
							}
							if (newstr.equals(endWord)){			
								min=level;
							}
						    	
						}
					}
				}
			}
		}
		for(String w:lastmap.keySet()){
			System.out.print(w+":");
			for(String x:lastmap.get(w)){
				System.out.print(x+"-");
			}
			System.out.println();
		}
		List<List<String>>  results= new ArrayList<List<String>>();
		List<String> result=new ArrayList<>();
		DFS(endWord,beginWord,result,results);
		return results;
    }
	private void DFS(String endWord,String beginWord,List<String> result,List<List<String>>  results){
		if(endWord.equals(beginWord)){
			result.add(0,beginWord);
			results.add(new ArrayList<>(result));
			result.remove(0);
			return ;
		}
		result.add(0,endWord);
		if(lastmap.get(endWord)!=null){
			for(String s:lastmap.get(endWord)){
				DFS(s,beginWord,result,results);
			}
		}
		result.remove(0);
	}

	public static void main(String[]args){
		 h_126_WordLadderll s=new h_126_WordLadderll();
		 Set<String> wordList=new HashSet<>();
		 wordList.add("hot");
		 wordList.add("lot");
		 wordList.add("dot");
		 wordList.add("log");
		 wordList.add("dog");
		 String begin="hit";
		 String end="cog";
		 List<List<String>> res= s.findLadders(begin, end, wordList);
		 for(List<String> w:res){
			 for(String st:w){
				 System.out.print(st+"-");
			 }
			 System.out.println();
		 }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值