问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

剑指Offer II 114. 外星文字典 : 建图 + 拓扑排序 运用题

发布网友 发布时间:2024-10-01 17:58

我来回答

1个回答

热心网友 时间:2024-11-01 13:21

题目描述

这是 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"]输出:""解释:不存在合法字母顺序,因此返回 "" 。

提示:

$1 <= words.length <= 100$

$1 <= words[i].length <= 100$

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

建图 + 拓扑排序

为了方便,我们称 words 为 ws,同时将两个字符串 a 和 b 之间的字典序关系简称为「关系」。

由于数组长度和每个 $ws[i]$ 的最大长度均为 $100$,我们可以实现复杂度为 $O(n^3)$ 复杂度的算法。

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

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

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

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

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

代码:

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;}}

时间复杂度:令 $n$ 为数组 ws 的长度,统计字符数的复杂度为 $O(\sum_{i}^{n - 1} len(ws[i]))$,建图复杂度为 $O(n^3)$;跑拓扑序构建答案复杂度 $O(n^2)$。整体复杂度为 $O(n^3)$

空间复杂度:$O(n^2)$

最后

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

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

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

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

原文:https://juejin.cn/post/7103721757957160973
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何画出3d立体画 我想问问收到发票怎么做分录 学生平板电脑改成正常平板教程 别人拿qq骂我,但发的是语音,我举报后他却没有什么反应,还是和原来一... 信报箱可以放牛奶吗 2024贵州中高考生免费景点有哪些 这图片出自哪个游戏或同人动漫? 中华人民共和国可再生能源法修正案说明 可再生资源的利用措施 中广核的校招待遇好不好? 松下空调暖风外机转冷风外机不转什么会事? 《极限国度》破解补丁怎么用:用法简介:《极限国度》破解补丁安装... 30亿年前的地球是什么样的?或许那是一个名副其实的"水星" 王安石为什么在泊船瓜洲对''到''过''入''满''不满选择绿 "春风又绿江南岸",王安石最后为什么用"绿"字 ...多次修改,诗人曾经用过哪些字?为什么决定用绿字? 王安石在诗句中为什么要选"绿 丁桂儿脐贴的危害 自制中药面膜配方'什么面膜补水最好 中央空调用电问题 ...广大什么在内的我国工人阶级是改革开放和社会主义现代化建设..._百... 什么始终是推进改革开放和社会主义现代化的精神力量 派出所拘留犯人吗 ...公安机关立案了,却迟迟不抓犯人,请问这种情况被害人该怎么办... ...电视机恢复出厂设置了,一个台都没有该怎么办?自动搜索不到频道_百度... 民间非营利组织的会计报表至少应当包括资产负债表、收入支出表和... ...会计报表包括资产负债表、收入支出表和现金流量表。(). 用日常生活常识轻松读懂财务报表 去英国留学时,需要注意哪些社交细节? 留学英国应该怎么适应? XBOX360的Dlc需要全部的 XBOX360使命召唤高级战争可以直接更新TU13吗?还是必须要把TU1-TU13... 我安卓手机怎么总是自己联网啊 新买的联想乐PHONE自动联网怎么办?推送信息都关了。急急急!!! 我的手机CMNET老是自动连接怎摸办?急急急 急急急,为什么我的索爱LT18i里面的软件总是自动联网? ...淘宝买的号。。木有卡。。试了各种办法都不行,,急急急... 移动手机自动上网,已经欠费了,还在上网,每天扣我18元,怎么解决,急急 苹果手机老自动上网怎么办? 急急急!手机wlan自动登录怎么取消? 急急急!手机中了MSexe.exe,时不时联网,怎么办??? 苹果肌填充前后需要注意什么 苹果肌填充前后注意什么 胶原蛋白丰苹果肌的注意事项? 填充苹果肌一般玻尿酸填充苹果肌后的注意事项 填充的苹果肌前应该了解些什么? ...图本图中l2345标注点代表啥管件、请各位大师指教? 这个大样图怎么看,现场做的和图纸有什么出入,我有点看不懂,请大师指教... 28岁,低压和高压分别是多少范围,血压差是多是,体质才算是很好呢? 浴霸开关5开如何接线