127. 单词接龙

Problem: 127. 单词接龙

文章目录

思路

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。很显然这道题目可以用双向广搜来解决。

解题方法

将开始字符添加到小的一侧(set),将结束字符添加到大的一侧(set)。

从小的一侧开始拓展,暴力展开,如果大的一侧中有与当前字符相同的就说明找到了,两侧连通起来的,返回当前的len即可,每变换一次在总的字典中寻找如果存在,删除记录防止重复也就是剪枝。交换的过程:如果当前层小于等于较大层,交换当前层和较小层,反之,当前层大于较大层,交换当前层和较大层,较大层和较小层

复杂度

时间复杂度:

时间复杂度方面,由于我们同时从两个方向进行搜索,所以时间复杂度会相对较低。具体的时间复杂度取决于搜索的层数,最坏情况下为 O ( M ∗ N 2 ) O(M*N^2) O(M∗N2),其中M为wordList的长度,N为单词的平均长度。

空间复杂度:

空间复杂度方面,我们使用了三个集合smallLevel、bigLevel和nextLevel来存储单词,以及一个HashSet来存储总词汇表。所以空间复杂度为 O ( M ) O(M) O(M),其中M为wordList的长度。

Code

Java 复制代码
class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        // 总词汇表
        Set<String> dict = new HashSet<>(wordList);
        if (!dict.contains(endWord)) {
            return 0;
        }
        // 数据量小的一侧
        Set<String> smallLevel = new HashSet<>();
        // 数据量大的一侧
        Set<String> bigLevel = new HashSet<>();
        // 数据量小的下一侧
        Set<String> nextLevel = new HashSet<>();
        smallLevel.add(beginWord);
        bigLevel.add(endWord);
        for (int len = 2; !smallLevel.isEmpty(); len++) {
            for (String w : smallLevel) {
                // 从小的一侧拓展
                char[] word = w.toCharArray();
                for (int j = 0; j < word.length; j++) {
                    char old = word[j];
                    for (char change = 'a'; change <= 'z'; change++) {
                        if (change != old) {
                            word[j] = change;
                            String next = String.valueOf(word);
                            if (bigLevel.contains(next)) {
                                return len;
                            }
                            if (dict.contains(next)) {
                                dict.remove(next);
                                nextLevel.add(next);
                            }
                        }
                    }
                    word[j] = old;
                }

            }
            if (nextLevel.size() <= bigLevel.size()) {
                // 交换当前层和较小层
                Set<String> temp = smallLevel;
                smallLevel = nextLevel;
                nextLevel = temp;
            } else {
                // 当前层大于较大层 交换当前层和较大层 较大层和较小层
                Set<String> temp = smallLevel;
                smallLevel = bigLevel;
                bigLevel = nextLevel;
                nextLevel = temp;
            }
            nextLevel.clear();
        }
        return 0;
    }
}
相关推荐
文丑颜不良啊9 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发9 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力10 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力10 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A10 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵10 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
严肃小白兔11 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
nice_lcj52011 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
微小的鱼11 小时前
Linux的渲染与显示系统链路
android·java·linux
青少儿编程课堂12 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛