当前位置: 首页 > news >正文

面试算法108:单词演变

题目

输入两个长度相同但内容不同的单词(beginWord和endWord)和一个单词列表,求从beginWord到endWord的演变序列的最短长度,要求每步只能改变单词中的一个字母,并且演变过程中每步得到的单词都必须在给定的单词列表中。如果不能从beginWord演变到endWord,则返回0。假设所有单词只包含英文小写字母。
例如,如果beginWord为"hit",endWord为"cog",单词列表为[“hot”,“dot”,“dog”,“lot”,“log”,“cog”],则演变序列的最短长度为5,一个可行的演变序列为"hit"→"hot"→"dot"→"dog"→"cog"。

分析

应用图相关算法的前提是找出图中的节点和边。这个问题是关于单词的演变的,所以每个单词就是图中的一个节点。如果两个单词能够相互演变(改变一个单词的一个字母能变成另一个单词),那么这两个单词之间有一条边相连。
在这里插入图片描述
为了求得两个节点之间的最短距离,常见的解法是用两个队列实现广度优先搜索算法。一个队列queue1中存放离起始节点距离为d的节点,当从这个队列中取出节点并访问的时候,与队列queue1中节点相邻的节点离起始节点的距离都是d+1,将这些相邻的节点存放到另一个队列queue2中。当队列queue1中的所有节点都访问完毕时,再访问队列queue2中的节点,并将相邻的节点放入queue1中。可以交替使用queue1和queue2这两个队列由近及远地从起始节点开始搜索所有节点。

解: 单向广度优先搜索

public class Test {
    public static void main(String[] args) {
        List<String> wordList = Arrays.asList("hot", "dot", "dog", "lot", "log", "cog");
        int result = ladderLength("hit", "cog", wordList);
        System.out.println(result);
    }

    public static int ladderLength(String beginWord, String endWord, List<String> wordList) {
        Queue<String> queue1 = new LinkedList<>();
        Queue<String> queue2 = new LinkedList<>();
        Set<String> notVisited = new HashSet<>(wordList);
        int length = 1;
        queue1.add(beginWord);
        while (!queue1.isEmpty()) {
            String word = queue1.remove();
            if (word.equals(endWord)) {
                return length;
            }

            List<String> neighbors = getNeighbors(word);
            for (String neighbor : neighbors) {
                if (notVisited.contains(neighbor)) {
                    queue2.add(neighbor);
                    notVisited.remove(neighbor);
                }
            }

            if (queue1.isEmpty()) {
                length++;
                queue1 = queue2;
                queue2 = new LinkedList<>();
            }
        }

        return 0;
    }

    private static List<String> getNeighbors(String word) {
        List<String> neighbors = new LinkedList<>();
        char[] chars = word.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char old = chars[i];

            for (char ch = 'a'; ch <= 'z'; ++ch) {
                if (old != ch) {
                    chars[i] = ch;
                    neighbors.add(new String(chars));
                }
            }

            chars[i] = old;
        }

        return neighbors;
    }

}
http://www.dtcms.com/a/7209.html

相关文章:

  • 一个Pygame的Hello World示例程序
  • phpstorm配置ftp
  • 【angular教程240105】02绑定属性 绑定数据、条件判断、加载图片、【ngClass】 【ngStyle】、Angular管道
  • springBoot配置文件(四)application常见配置
  • 雍禾植发袁宣心中有“术”,雍禾医疗帮用户重启人生
  • swaggerUI不好用,试试这个openapiUI?
  • 【Proteus仿真】【Arduino单片机】智能感应温控风扇
  • c语言:输入成绩,统计不及格人数|练习题
  • c++跨平台ui
  • react中实现拓扑图
  • 通过Docker搭建4节点的Tendermint集群
  • 单机部署Rancher
  • Java虚拟机ART 读书笔记 第2章 深入理解Class文件格式
  • 【博士每天一篇文-算法】Graph Structure of Neural Networks
  • 一文详解动态 Schema
  • SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用
  • 多PC文件夹同步方案
  • k8s yaml文件pod的生命周期
  • 基于双闭环PI和SVPWM的PMSM控制器simulink建模与仿真
  • 举例说明计算机视觉(CV)技术的优势和挑战。
  • 【方法】PPT设置密码后如何修改?
  • Python进程间通信
  • 手机与电脑投屏互联方案
  • MySQL语法练习-DML语法练习
  • 基于长短期神经网络LSTM的测量误差预测
  • 混淆技术概论
  • Hackathon | Mint Blockchain 启动全球 NIP 创意提案黑客松活动!
  • 精进单元测试技能——Pytest断言的艺术
  • 师傅带练|在线实习项目,提供实习证明
  • 有趣的前端知识(二)