127. 单词接龙

127. 单词接龙

原题链接:

127. 单词接龙

https://leetcode.cn/problems/word-ladder/description/

完成情况:

解题思路:

这段代码是一个用于寻找从beginWord到endWord的最短转换序列长度的算法。以下是代码的清晰解释:

  1. 创建一个HashSet 'wordSet',其中存储了给定的单词列表,以加快查找速度。
  2. 检查特殊情况:如果wordSet为空或者不包含endWord,则直接返回0。
  3. 创建一个队列 'queue' 用于BFS(广度优先搜索)。
  4. 将beginWord加入队列,并创建一个HashMap 'map',用于记录每个单词对应的路径长度,将beginWord对应长度设置为1。
  5. 在队列不为空的情况下,执行以下循环:
    • 取出队列头部的单词 'word'。
    • 获取 'word' 对应的路径长度 'path'。
    • 遍历 'word' 的每个字符:
      • 将 'word' 转换为字符数组 'chars',以便替换字符。
      • 从 'a' 到 'z' 遍历替换第i个字符。
      • 构建新的单词 'newWord'。
      • 如果 'newWord' 等于 endWord,则返回当前路径长度加1。
      • 如果 'newWord' 在wordSet中且未被访问过,则将其路径长度记录在map中,并加入队列。
  6. 如果未找到路径,则返回0。

这段代码使用BFS算法,通过逐个替换单词中的字符来寻找从beginWord到endWord的最短转换序列长度。

参考代码:

_127单词接龙

java 复制代码
package 代码随想录.图论;

import java.util.*;

public class _127单词接龙 {
    /**
     * 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。
     * 如果不存在这样的转换序列,返回 0 。
     * @param beginWord
     * @param endWord
     * @param wordList
     * @return
     */
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        //每次只能变动一个字符,且变化后的单词,必须是wordList里面的单词,,然后求 【最短转换序列 中的 单词数目】,,如果找不到,则返回false
        //上来先进行去重操作
        HashSet<String> wordSet = new HashSet<String>(wordList);//去重后,每次尝试修改一个,不要想的太复杂
        if (wordList.size() == 0 || !wordList.contains(endWord)){   //去除空集
            return 0;
        }
        Deque<String> myQueue = new LinkedList<String>();
        myQueue.offer(beginWord);
        Map<String,Integer> map = new HashMap<>();  //记录走到当前位置所需最短步长
        map.put(beginWord,1);
        while (!myQueue.isEmpty()){
            String wordSection = myQueue.poll();    //取出当前队头元素
            int pathList = map.get(wordSection);    //记录其到达长度
            for (int i = 0;i<wordSection.length();i++){ //逐个单词,逐一替换,进行尝试
                char [] chars = wordSection.toCharArray();  //将单词转换为charArray,方便逐一判断与替换
                for (char ch = 'a';ch <= 'z';ch++){
                    chars[i] = ch;  //逐一单词尝试去进行替换,同时判别一下是否存在当前这一单词序列
                    String comWord = String.valueOf(chars); //转回String
                    if (comWord.equals(endWord)){   //如果与最终答案完全匹配
                        return pathList+1;  //记录在案
                    }
                    if (wordSet.contains(comWord) && !map.containsKey(comWord)){ //如果新单词在set中,但是没有访问过
                        map.put(comWord,pathList+1);    //记录在案
                        myQueue.offer(comWord);     //并记录尾端
                    }
                }

            }
        }
        return 0;
    }
}

_127单词接龙_bfs

java 复制代码
package 代码随想录.图论;

import java.util.*;

public class _127单词接龙_bfs {
    /**
     *
     * @param beginWord
     * @param endWord
     * @param wordList
     * @return
     */
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        if (wordList.size() == 0 || !wordList.contains(endWord)){   //去除空集
            return 0;
        }
        int resLeft = 0,resRight = 0;
        Queue<String> queueLeft = new ArrayDeque<String>(),queueRight = new ArrayDeque<String>();
        queueLeft.add(beginWord);
        queueRight.add(endWord);
        //左右两边,同时开始找
        //从beginword开始bfs时,把遍历到的节点存入hashSetLeft中
        //从endWord开始bfs时,把遍历到的节点存入hashSetRight中
        Set<String> hashSetLeft = new HashSet<String>();
        Set<String> hashSetRight = new HashSet<String>();
        hashSetLeft.add(beginWord);
        hashSetRight.add(endWord);
        //判断两边能否构成连接通路
        //只要有一个队列为空,说明beginWord就无法转化到endWord
        while (!queueLeft.isEmpty() && !queueRight.isEmpty()){
            //左端点检测
            ++resLeft;
            int size = queueLeft.size();
            for (int i = 0;i<size;i++){
                String curWord = queueLeft.poll();
                //判别右边能否与左边匹对上
                if (hashSetRight.contains(curWord))  return  resLeft + resRight;
                //-----------------------------------------------------------------
                for(String chooseWord : wordList){
                      if (hashSetLeft.contains(chooseWord) || !isVaild(curWord,chooseWord)) continue;
                      hashSetLeft.add(chooseWord);
                      queueLeft.add(chooseWord);
                }
            }
            //右端点检测
            ++resRight;
            size = queueRight.size();
            for (int i = 0;i<size;i++){
                String curWord = queueRight.poll();
                //只要hashSetLeft中存在curWord,说明从curWord可以转换到 endWord
                if(hashSetLeft.contains(curWord))   return resLeft + resRight;
                for(String chooseWord : wordList){
                    if (hashSetRight.contains(chooseWord) || !isVaild(curWord,chooseWord)) continue;
                    hashSetRight.add(chooseWord);
                    queueRight.add(chooseWord);
                }
            }
        }

        return 0;
    }

    /**
     * 判断curWord与chooseWord是否误差仅为1个字符
     * @param curWord
     * @param chooseWord
     * @return
     */
    private boolean isVaild(String curWord, String chooseWord) {
        int count = 0;
        for (int i = 0;i<curWord.length();i++){
            if (curWord.charAt(i) != chooseWord.charAt(i)){
                ++count;
            }
        }
        return count == 1;

    }
}

错误经验吸取

相关推荐
小生凡一2 分钟前
腾讯二面:TCC分布式事务 | 图解TCC|用Go语言实现一个TCC
开发语言·分布式·golang
苍煜2 分钟前
MinIO 教程:从入门到Spring Boot集成
java·spring boot·后端·minio
掘金詹姆斯3 分钟前
LangChain4j—持久化聊天记忆 Persistence(五)
java·人工智能
minji...6 分钟前
C语言 函数递归
c语言·开发语言·算法
你好我是咯咯咯8 分钟前
代码随想录算法训练营Day36
算法
uhakadotcom16 分钟前
如何用AI打造高效招聘系统,HR效率提升100%!
后端·算法·面试
程序猿大波17 分钟前
基于Java,SpringBoot,Vue,HTML宠物相亲配对婚恋系统设计
java·vue.js·spring boot
云上空26 分钟前
C#初级知识总结
开发语言·c#
Leaf吧32 分钟前
分布式定时任务(xxl-job)
java·分布式
松树戈40 分钟前
PostgreSQL使用LIKE右模糊没有走索引分析&验证
数据库·postgresql