IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【综合笔试题】剑指 Offer II 114. 外星文字典 -> 正文阅读

[数据结构与算法]【综合笔试题】剑指 Offer II 114. 外星文字典

题目描述

这是 LeetCode 上的 剑指 Offer II 114. 外星文字典 ,难度为 困难

Tag : 「图论」、「拓扑排序」、「建图」、「图论 BFS」

现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同。

给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。

请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。

字符串 s 字典顺序小于 字符串 t 有两种情况:

在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么?s 的字典顺序小于 t 。 如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t

示例 1:

输入:words?=?["wrt","wrf","er","ett","rftt"]

输出:"wertf"

示例 2:

输入:words?=?["z","x"]

输出:"zx"

示例 3:

输入:words?=?["z","x","z"]

输出:""

解释:不存在合法字母顺序,因此返回?""?。

提示:

  • words[i] 仅由小写英文字母组成

建图 + 拓扑排序

为了方便,我们称 wordsws,同时将两个字符串 ab 之间的字典序关系简称为「关系」。

由于数组长度和每个 的最大长度均为 ,我们可以实现复杂度为 复杂度的算法。

首先容易想到,我们从前往后处理每个 ,利用 ws 数组本身已按字典序排序,然后通过 的关系(其中 的范围为 ),来构建字符之间的关系。

具体的,当我们明确字符 字典序要小,可以建立从 的有向边,同时统计增加 的出度,增加 的入度。

当建图完成后,我们从所有入度为 的点开始(含义为没有比这些字符字典序更小的字符),跑一遍拓扑排序:在 BFS 过程中,不断的删点(出队的点可以看做从图中移除)和更新删除点的出边点的入度,若有新的入度为 的点,则将其进行入队操作。

不了解拓扑排序的同学可以看前置 🧀 : 图论拓扑排序入门

若最终出队节点数量与总数量 相等,说明这是一张拓扑图(无环,字符之间不存在字典序冲突),出队的顺序即是字典序,否则存在冲突,返回空串。

代码:

class?Solution?{
????int?N?=?26,?M?=?N?*?N,?idx?=?0,?cnt?=?0;
????int[]?he?=?new?int[N],?e?=?new?int[M],?ne?=?new?int[M];
????int[]?in?=?new?int[N],?out?=?new?int[N];
????boolean[]?vis?=?new?boolean[26];
????void?add(int?a,?int?b)?{
????????e[idx]?=?b;
????????ne[idx]?=?he[a];
????????he[a]?=?idx++;
????????out[a]++;?in[b]++;
????}
????public?String?alienOrder(String[]?ws)?{
????????int?n?=?ws.length;
????????Arrays.fill(he,?-1);
????????for?(int?i?=?0;?i?<?n;?i++)?{
????????????for?(char?c?:?ws[i].toCharArray())?{
????????????????if?(!vis[c?-?'a']?&&?++cnt?>=?0)?vis[c?-?'a']?=?true;
????????????}
????????????for?(int?j?=?0;?j?<?i;?j++)?{
????????????????if?(!build(ws[j],?ws[i]))?return?"";
????????????}
????????}
????????Deque<Integer>?d?=?new?ArrayDeque<>();
????????for?(int?i?=?0;?i?<?26;?i++)?{
????????????if?(vis[i]?&&?in[i]?==?0)?d.addLast(i);
????????}
????????StringBuilder?sb?=?new?StringBuilder();
????????while?(!d.isEmpty())?{
????????????int?u?=?d.pollFirst();
????????????sb.append((char)(u?+?'a'));
????????????for?(int?i?=?he[u];?i?!=?-1;?i?=?ne[i])?{
????????????????int?j?=?e[i];
????????????????if?(--in[j]?==?0)?d.addLast(j);
????????????}
????????}
????????return?sb.length()?==?cnt???sb.toString()?:?"";
????}
????boolean?build(String?a,?String?b)?{
????????int?n?=?a.length(),?m?=?b.length(),?len?=?Math.min(n,?m);
????????for?(int?i?=?0;?i?<?len;?i++)?{
????????????int?c1?=?a.charAt(i)?-?'a',?c2?=?b.charAt(i)?-?'a';
????????????if?(c1?!=?c2)?{
????????????????add(c1,?c2);
????????????????return?true;
????????????}
????????}
????????return?n?<=?m;
????}
}
  • 时间复杂度:令 为数组 ws 的长度,统计字符数的复杂度为 ,建图复杂度为 ;跑拓扑序构建答案复杂度 。整体复杂度为
  • 空间复杂度:

最后

这是我们「刷穿 LeetCode」系列文章的第 剑指 Offer II 114 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关的资料可访问排版精明的 合集新基地 🎉🎉

本文由 mdnice 多平台发布

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:20:58  更:2022-06-25 18:23:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:30:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码