127. 单词接龙

这篇具有很好参考价值的文章主要介绍了127. 单词接龙。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

和433.最小基因变化这道题一样的解法。
https://blog.csdn.net/qq_43606119/article/details/135538247

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        Set<String> cnt = new HashSet<>();
        for (int i = 0; i < wordList.size(); ++i) {
            cnt.add(wordList.get(i));
        }
        if (!cnt.contains(endWord)) return 0;
        Set<String> visited = new HashSet<>();
        Queue<String> q = new ArrayDeque<>();
        q.offer(beginWord);
        visited.add(beginWord);
        int step = 1;
        while (!q.isEmpty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                String curr = q.poll();
                for (int u = 0; u < curr.length(); ++u) {
                    for (int v = 0; v < 26; ++v) {
                        if (curr.charAt(u) != 'a' + v) {
                            StringBuffer sb = new StringBuffer(curr);
                            sb.setCharAt(u, (char)('a' + v));
                            String next = sb.toString();
                            if (!visited.contains(next) && cnt.contains(next)) {
                                if (next.equals(endWord)) return step + 1;
                                q.offer(next);
                                visited.add(next);
                            }
                        }
                    }
                }
            }
            ++step;
        }
        return 0;
    }
}

改进:

在本题中可以使用虚拟节点将各个单词进行连接,例如hit可以有三个虚拟节点hi*、h*t、*it,将其和hit进行连接,所有单词都如此处理,优化建图。

注意因为添加了虚拟节点,所以我们得到的距离为实际最短路径长度的两倍。同时我们并未计算起点对答案的贡献,所以我们应当返回距离的一半再加一的结果。文章来源地址https://www.toymoban.com/news/detail-781867.html

class Solution {
    Map<String, Integer> wordID = new HashMap<>();
    List<List<Integer>> edge = new ArrayList<>();
    int nodeNum = 0;
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        for (String word : wordList) {
            addEdge(word);
        }
        addEdge(beginWord);
        if (!wordID.containsKey(endWord)) {
            return 0;
        }
        // 初始化dis数组,表示从beginWord到每个单词的最短转变路径长度,初始值为Integer.MAX_VALUE。
        int[] dis = new int[nodeNum];
        Arrays.fill(dis, Integer.MAX_VALUE);
        int beginID = wordID.get(beginWord), endID = wordID.get(endWord);
        dis[beginID] = 0;
        Queue<Integer> q = new LinkedList<>();
        q.offer(beginID);
        while (!q.isEmpty()) {
            int curr = q.poll();
            if (curr == endID) return dis[curr] / 2 + 1;
            for (int e : edge.get(curr)) {
                if (dis[e] == Integer.MAX_VALUE) {
                    dis[e] = dis[curr] + 1;
                    q.offer(e);
                }
            }
        }
        return 0;
    }

    private void addEdge(String word) {
        addWord(word);
        int id1 = wordID.get(word);
        char[] array = word.toCharArray();
        for (int i = 0; i < array.length; ++i) {
            char temp = array[i];
            array[i] = '*';
            String newWord = new String(array);
            addWord(newWord);
            int id2 = wordID.get(newWord);
            edge.get(id1).add(id2);
            edge.get(id2).add(id1);
            array[i] = temp;
        }
    }

    private void addWord(String word) {
        if (!wordID.containsKey(word)) {
            wordID.put(word, nodeNum++);
            edge.add(new ArrayList<Integer>());
        }
    }
}

到了这里,关于127. 单词接龙的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数据结构与算法之字符串: Leetcode 557. 反转字符串中的单词 III (Typescript版)

    翻转字符串中的单词 III https://leetcode.cn/problems/reverse-words-in-a-string-iii/ 描述 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 示例 2: 提示: 1 = s.length = 5 * 1 0 4 10^4 1 0 4 s 包含可打印的 ASCII 字符。 s 不包含任何开头或

    2024年02月01日
    浏览(14)
  • 华为OD机考真题--单词接龙--带答案

    2023华为OD统一考试(A+B卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 题目描述: 单词接龙的规则是: 用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,

    2024年02月14日
    浏览(12)
  • 【免费题库】华为OD机试 - 单词接龙(Java & JS & Python & C & C++)

    哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 单词接龙的规则是: 可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已

    2024年04月10日
    浏览(14)
  • 算法leetcode|79. 单词搜索(rust重拳出击)

    算法leetcode|79. 单词搜索(rust重拳出击)

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月09日
    浏览(10)
  • 算法leetcode|58. 最后一个单词的长度(rust重拳出击)

    给你一个字符串 s ,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 1 = s.length = 10 4 s 仅有英文字母和空格 ’ ’ 组成 s 中至少存在一个单词 面对这道算法题目,二当家的

    2024年02月13日
    浏览(16)
  • 算法leetcode|30. 串联所有单词的子串(rust重拳出击)

    给定一个字符串 s 和一个字符串数组 words 。 words 中所有字符串 长度相同 。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = [\\\"ab\\\",\\\"cd\\\",\\\"ef\\\"] , 那么 \\\"abcdef\\\" , \\\"abefcd\\\" , \\\"cdabef\\\" , \\\"cdefab\\\" , \\\"efabcd\\\" , 和 \\\"efcdab\\\" 都是串联子串。

    2023年04月08日
    浏览(11)
  • 【JavaScript数据结构与算法】字符串类(反转字符串中的单词)

    【JavaScript数据结构与算法】字符串类(反转字符串中的单词)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端(Node.js) 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力 n 年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目

    2023年04月09日
    浏览(13)
  • 【算法与数据结构】343、LeetCode整数拆分

    【算法与数据结构】343、LeetCode整数拆分

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :博主做这道题的时候一直在思考,如何找到 k k k 个正整数, k k k 究竟为多少合适。从数学的逻辑上来说,将 n n n 均分为 k k k 个数之后, k k k 个数的乘积为最大(类似于相同周长

    2024年01月17日
    浏览(14)
  • 【算法与数据结构】494、LeetCode目标和

    【算法与数据结构】494、LeetCode目标和

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题和这道题【算法与数据结构】1049、LeetCode 最后一块石头的重量 II类似,同样可以转换成01背包问题。下面开始论述。假设添加正号的整数子集和为 p o s i t i v e positive p os i t

    2024年01月20日
    浏览(17)
  • 【算法与数据结构】474、LeetCode一和零

    【算法与数据结构】474、LeetCode一和零

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题要找strs数组的最大子集,这个子集最多含有 m m m 个0和 n n n 个1。本题也可以抽象成一个01背包的问题。其中,strs内的元素就是物品,而 m m m 和 n n n 就是背包的维度。 d p [

    2024年01月22日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包