LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示

2023-11-13

剑指 Offer II 114. 外星文字典
现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同。
给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。
请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 “” 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。
字符串 s 字典顺序小于 字符串 t 有两种情况:
在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。
如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t 。

背景知识

图的概念

图是由节点以及连接这些节点边组成.

图的表示方法

①.邻接矩阵
邻接矩阵是表示图中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵的row和col表示的是0-n-1的n个点。
对包含n个节点的图,可以用二维数组(矩阵)来表示节点之间两两的连接关系

vector<vector<int>> edges;//用二纬数组表示各点之间两两的连通关系
int val = edges[i][j];//表示从节点i到节点j的边,0则表示非连通,有权重时也可以表示权重值

②.邻接列表

邻接矩阵可以方便的得到一个节点到另个节点的关联关系,但是邻接矩阵给每个节点都分配n个边的空间,但实际有许多变是不存在的,会造成空间的浪费。

vector<vector<vector<int>>>edges(n);//无权图时,用n个二维数组构成的vector来存储邻接列表
edges[i][j][0];//表示节点i的第j个连通节点编号
edges[i][j][1];//表示节点i到第j个连通节点边的权重

③.边缘列表
边缘列表是具有连接顶点及其权重的边的集合。

vector<vector<int>> edges;//带权图时,用一系列长度为3的vector构成vector来存储边缘列表
int u = edges[i][0];//第i条边的起点
int v = edges[i][1];//第i条边的终点
int val = edges[i][2];//边 u -> v 的权重

BFS 搜索算法

①.概念
广度优先搜索(BFS)的本质就是从源点出发,按层顺序进行遍历,把每一层的所有节点访问完后再转到下一层;使用队列(queue)来记录将要访问的点,访问完每个点就出队,然后把它的邻近点入队;同时要记录哪些点被访问过以避免重复访问。

②.BFS 搜索算法模板

int depth = 0 // 记录遍历到第几层,当前在第几层则和源点的距离为几
while( !queue.empty())//队列非空
{
    depth++;//
    int queue_size = queue.size();// 当前层的元素个数
    for(int i = 0;i < queue_size;i++)
    {
        cur_node = queue.front();queue.pop();//取出当前节点并从队列中删除
        for node 的所有相邻结点 m:
            if m 未访问过:
                queue.push(m);
                //标记访问状态,一定要在加入队列时就要标记其访问状态
                /*****/
    }
}

题目分析

题目分析

①.两个相邻字符的第一个不相同的字符,构成了一个先后顺序,可视为有向图的一条边。

②.依次遍历和比较列表中的所有相邻字符串,构建图的邻接列表,并记录节点的入度。

③.采用 BFS 算法,入度为 0 的节点先入队。

④.根据题目描述,若前面字符串是后面字符串的前缀,则直接返回空。

代码示例

class Solution {
public:
    string alienOrder(vector<string>& words) {
        
        unordered_map<char,unordered_set<char> > edges;//邻接列表
        unordered_map<char,int> inedg;//节点的入度
        //初始化图的节点
        for( auto & word : words )
        {
            for( auto & c : word)
            {
                if( edges.find(c) == edges.end() )
                {
                    edges[c] = {};
                    inedg[c] = 0;
                }
            }
        }
        //构建邻接列表
        int size = words.size();
        for( int i = 0;i+1 < size;++i)
        {
            auto word_1 = words[i];
            auto word_2 = words[i+1];

            int size_1 = word_1.size();
            int size_2 = word_2.size();

            int j = 0;
            while( j < size_1 && j < size_2 )
            {
                if( word_1[j] != word_2[j] )//第一个不相同的字母
                {
                    if( edges[ word_1[j] ].find(word_2[j]) == edges[ word_1[j] ].end() )
                    {
                        edges[ word_1[j] ].insert( word_2[j] );//可访问节点增加
                        inedg[word_2[j]] ++;//节点入度增加
                        
                    }
                    break;
                }   
                ++j;
            }
            if( j == size_2 && j < size_1) return "";// 前面字符串长度大于后面字符串
        }

        queue<char> m_queue;
        for( auto & edg : inedg )
        {
            if( edg.second == 0 ) m_queue.push( edg.first );
        }

        string res = "";
        while( !m_queue.empty())
        {
            auto u = m_queue.front();m_queue.pop();
            res.push_back(u);
            for( auto v : edges[u])
            {
                if( --inedg[v] == 0)
                {
                    m_queue.push(v);
                }
            }
        }
        if( res.size() != edges.size() ) return "";
        return res;

    }
};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示 的相关文章

  • 运算放大器---增益带宽积(GBW)

    增益带宽积 GBW 电压反馈型运算放大器的增益带宽决定了其在某项应用中的有效带宽 将增益带宽除以应用中的实际闭环增益 便可大致估算出最大可用带宽 对于电压反馈放大器 增益带宽积 GBW 是衡定的常数 很多的应用都得益于所选择的更大带宽 转换
  • 电路板上为何要有孔洞?何谓PTH/NPTH/vias(导通孔)

    http www greattong com archives view 443 1 html 电路板上为何要有孔洞 何谓PTH NPTH vias 导通孔 发布时间 2016 07 13 09 39 阅读 3613 来源 技术文章 责任编
  • Vim插件合集 (打造你的专属炫酷IDE)

    Vim插件合集 本篇 主要来介绍一下 如何使用 Vim的插件功能 去把Vim打造成 炫酷 多功能的IDE 让你可以用Vim编写Python Go 等等 而不用繁重的 Pycharm 等高级Ide 效果图 前置知识 vim映射 就是映射你自己

随机推荐

  • 阿里全球数学竞赛最强10人名单出炉:仅1人来自北大,但北大是最大赢家

    鱼羊 杨净 发自 凹非寺量子位 报道 公众号 QbitAI 又一次的全球数学狂欢 落下帷幕 经过4个月的赛程 第三届阿里巴巴全球数学竞赛结果新鲜出炉 52850名参赛选手中 最终有70人获奖 99 9 的人无缘奖牌 北大成最大赢家 不仅有2
  • react 中使用递归和 TS 泛型来处理树形数据

    解决场景 使用递归把树形数据中的 children 替换成 children undefind page1 ts import formatTree from formatData ts const treeLists name paren
  • 线性稳压电路

    如图为串联式稳压电路 之所以叫串联式是因为T管与负载RL串联 工作原理 1 稳压管 Dz 与限流电阻R串联 得到基准电压 2 与组成反馈网络 得到反馈电压 3 净输入量的变化 引起的变化 4 的变化使调整管T的c e 极间的电压降变化 从而
  • Linux文件目录类(常用指令)

    文件目录类 cd指令 基本语法 cd 参数 功能描述 切换到指定目录 cd 或者cd 回到自己的家目录 cd 回到当前目录的上一目录 绝对路径和相对路径 绝对路径 目标文件在硬盘上的真实路径 最精确路径 从根目录开始的 相对路径 相对于当前
  • 将程序打成jar包后运行mapReduce时出现File does not exit: hdfs://localhost....jar

    出现的问题 解决方法 直接向报错路径添加报错提示的文件
  • Installation failed with message Invalid File:

    最近在studio 在安装apk的时候遇到了这么个问题 他说我之前已经有安装版本了 但是这个apk却是我第一次安装 怎么回事 之前遇到过一次 自己不知道怎么解决了 当时忘记记录下来现在记录下来 给自己和后面遇到的朋友 提供一个快速的解决办法
  • 圣路易斯大学计算机科学,圣路易斯华盛顿大学计算机科学专业

    圣路易斯华盛顿大学计算机科学与工程系申请要求需要托福 接受雅思 需要GRE GPA 3 0 学费 47 300 年 春季 秋季入学 截止日 1月15日 PhD 3月1日 MS M Eng 圣路易斯华盛顿大学计算机科学与工程系课程 网络物理系
  • 说说你对Vue生命周期的理解?

    一 生命周期是什么 生命周期 Life Cycle 的概念应用很广泛 特别是在政治 经济 环境 技术 社会等诸多领域经常出现 其基本涵义可以通俗地理解为 从摇篮到坟墓 Cradle to Grave 的整个过程 在Vue中实例从创建到销毁的
  • OpenCV InputArray和OutputArray

    InputArray这个接口类可以是Mat Mat
  • Attention注意力机制--原理与应用

    Attention注意力机制 原理与应用 注意力机制即Attention mechanism在序列学习任务上具有巨大的提升作用 在编解码器框架内 通过在编码段加入A模型 对源数据序列进行数据加权变换 或者在解码端引入A模型 对目标数据进行加
  • 那些会阻碍程序员成长的细节[3]

    前两篇文间几乎是想到那里就写到那里 没有分门别类的加以阐述 本篇延续以上两篇文章的思路 在之前的基础再追加 没有看过前两篇文章的同学可通过这两个链接回顾一下 那些会阻碍程序员成长的细节 一 那些会阻碍程序员成长的细节 二 不能主动推动事物前
  • Halcon标定板标定

    halcon标定有自己的标定助手可以演示 不过拿到VS里面却不是很适用 尤其是关于畸变矫正和透视矫正算子的解释也没有 下面两个算子set origin pose gen image to world plane map关键参数怎么计算也没有
  • 【MyBatis-Plus】之批量插入

    一 应用情景介绍 在实际的项目开发过程中 常常遇到批量保存数据的场景 当数据量比较少 比如只有几条数据的情况下 我们可以使用 for 循环来 insert 数据 但如果数据量比较多的情况下就不行 特别是并发的情况下 因为这样会增加数据库的负
  • 一个学习编程的网站

    推荐一个学习编程的网站 https www runoob com
  • 请假流程

    作者 nogocn 在某一公司中 部门员工要休假的话需要部门主管的批准 如果休假天数大于10天的话 在部门主管的同意后 还必须上级主管批准 如果是部门主管要休假只要上级主管批准即可 在休假被批准之前 申请人可以撤销休假申请 每个员工还有多少
  • STM32的功耗模式

    按功耗由高到低排列 STM32 具有运行 睡眠 停止和待机四种工作模式 低功耗各模式下芯片工作情况 睡眠模式 仅关闭了内核时钟 内核停止运行 但其片上外设 CM4 核心的外设全都还照常 运行 有两种方式进入睡眠模式 它的进入方式决定了从睡眠
  • Java实现数据脱敏的方法

    在Java中 可以使用各种技术来实现数据脱敏 下面将介绍几种常见的Java实现数据脱敏的方法 字符串截取 字符串截取是一种简单的数据脱敏方法 它将敏感数据的一部分字符替换成 号或其他字符 例如 将身份证号码的前6位和后4位替换成 号 这样可
  • 开发一个文生图的功能

    文章目录 效果 开发环境 原理 核心代码 代码仓库 问题 效果 开发环境 Python 3 10 PyCharm 原理 借助开源项目stable diffusion 通过该项目封装python库diffusers 可以轻易的实现文生图的功能
  • css 强制不换行

    css中强制不换行 文本不会换行 文本会在在同一行上继续 直到遇到 br 标签为止 white space nowrap
  • LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示

    剑指 Offer II 114 外星文字典 现有一种使用英语字母的外星文语言 这门语言的字母顺序与英语顺序不同 给定一个字符串列表 words 作为这门语言的词典 words 中的字符串已经 按这门新语言的字母顺序进行了排序 请你根据该词典