力扣-10.26-127

在这里插入图片描述
在这里插入图片描述
方法一:(广度优先搜索算法)

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
		 int L=beginWord.length();
		 
		 Map<String, List<String>> allComboDict=new HashMap<String, List<String>>();
		 
		 wordList.forEach(
				 word->{
					 for(int i=0;i<L;i++) {
						 String new_Word=word.substring(0, i)+"*"+word.substring(i+1,L);
						 List<String> transmations=allComboDict.getOrDefault(new_Word, new ArrayList<String>());
						 transmations.add(word);
						 allComboDict.put(new_Word, transmations);
					 }
				 });
		 
		 // BFS需要的队列
		 Queue<Pair<String,Integer>> Q=new LinkedList<Pair<String,Integer>>();
		 Q.add(new Pair<String, Integer>(beginWord, 1));
		 
		 // 记录是否访问过的集合
		 Map<String, Boolean> visited=new HashMap<String, Boolean>();
		 visited.put(beginWord, true);
		 
		 while(!Q.isEmpty()) {
			 Pair<String, Integer> node=Q.remove();
			 String word=node.getKey();
			 int level=node.getValue();
			 for(int i=0;i<L;i++) {
				 String new_word=word.substring(0,i)+"*"+word.substring(i+1,L);
				 for(String adjacentWord : allComboDict.getOrDefault(new_word, new ArrayList<String>())) {
					 if(adjacentWord.equals(endWord)) {
						 return level+1;
					 }
					 if(!visited.containsKey(adjacentWord)) {
						 visited.put(adjacentWord, true);
						 Q.add(new Pair<String, Integer>(adjacentWord, level+1));
					 }
				 }
			 }
		 }
		 return 0;
    }
}

方法二:(双向广度优先算法)

class Solution {

    public static int visitWordNode(Queue<Pair<String, Integer>> Q,
			Map<String, Integer> visited,
			Map<String, Integer> othersVisited,
			int L,
			Map<String, List<String>> allComboDict) {
		Pair<String, Integer> node=Q.remove();
		String word=node.getKey();
		int level=node.getValue();
		
		for(int i=0;i<L;i++) {
			String new_word=word.substring(0,i)+"*"+word.substring(i+1,L);
			for(String adjacentWord : allComboDict.getOrDefault(new_word, new ArrayList<String>())) {
				if(othersVisited.containsKey(adjacentWord)) {
					return level+othersVisited.get(adjacentWord);
				}
				if(!visited.containsKey(adjacentWord)) {
					visited.put(adjacentWord, level+1);
					Q.add(new Pair<String, Integer>(adjacentWord, level+1));
				}
			}
		}
		return -1;
	}

    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
		 if(!wordList.contains(endWord)) {
			 return 0;
		 }
		 
		 int L=beginWord.length();
		 Map<String, List<String>> allComboDict=new HashMap<String, List<String>>();
		 
		 wordList.forEach(
				 word->{
					 for(int i=0;i<L;i++) {
						 String new_word=word.substring(0,i)+"*"+word.substring(i+1,L);
						 List<String> transmations=allComboDict.getOrDefault(new_word, new ArrayList<String>());
						 transmations.add(word);
						 allComboDict.put(new_word, transmations);
					 }
				 });
		 
		 // 双向BFS需要的队列
		 Queue<Pair<String, Integer>> Q_begin=new LinkedList<Pair<String,Integer>>();
		 Queue<Pair<String, Integer>> Q_end=new LinkedList<Pair<String,Integer>>();
		 Q_begin.add(new Pair<String, Integer>(beginWord, 1));
		 Q_end.add(new  Pair<String, Integer>(endWord, 1));
		 
		 // 记录遍历过的点
		 Map<String, Integer> visited_begin=new HashMap<String, Integer>();
		 Map<String, Integer> visited_end=new HashMap<String, Integer>();
		 visited_begin.put(beginWord, 1);
		 visited_end.put(endWord, 1);
		 
		 while(!Q_begin.isEmpty() && !Q_end.isEmpty()) {
			 int ans=visitWordNode(Q_begin,visited_begin,visited_end,L,allComboDict);
			 if(ans>-1) {
				 return ans;
			 }
			 ans=visitWordNode(Q_end, visited_end, visited_begin, L, allComboDict);
			 if(ans>-1) {
				 return ans;
			 }
		 }
		 return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值