leetcode剑指offer II 114. 外星文字典 (构建有向图+有向图的拓扑排序)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

题目描述:
现有一种使用英语字母的外星文语言,这门语言的字母顺序与英语顺序不同。
给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。
请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 “” 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。
字符串 s 字典顺序小于 字符串 t 有两种情况:
1)在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。
2)如果前面 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)分析怎样可以得到一个合法的顺序:对数组的单词每相邻的两个进行比较,第一个不一样的字母可以得到一个有效的顺序。
2)无法得到有效的顺序的两种情况:
a. 在输出所形成的有向图的时候有环,证明有关系是相互指的,无法得到一个整体的有效顺序。
b. 相邻两个单词满足后面的单词是前面的单词的前缀,且后面的单词的长度小于前面的单词的长度,例如words=[“ab",“a"]。
综上,本题的代码块大概可以分成两个部分,一个是利用数组中的单词生成有向图,一个是对有向图进行拓扑排序。
拓扑排序有深度优先和广度优先两种方式;
深度优先就是先遍历一条路径,为路径中的每一个结点标注一个状态,如果在路径中出现了重复的元素,则证明是有环的;
广度优先则是利用队列的方式,根据入度来进行排序输出,入度为0才可以输出,证明他之前的都已经输出,最终看得到的顺序长度是否与总长度相等,如果相等则得到一个有效的顺序。
下面是题解的截图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

class Solution:
    def alienOrder(self, words: List[str]) -> str:
    	# 利用<字母,[]列表>来生成有向图
        g = {}
        for c in words[0]:
            g[c] = []
        for i in range(1, len(words)):
            s = words[i - 1]
            t = words[i]
            for c in t:
                g.setdefault(c, [])
            flag = False
            for u, v in zip(s, t):
                if u != v:
                    g[u].append(v)
                    flag = True
                    break
            if not flag:  # 一种无法得到合法的情况
                if len(s) > len(t):
                    return ""

        visiting, visited = 1, 2  # 用来标志状态
        states = {}
        stack = []
        def dfs(u: str)-> bool:
            states[u] = visiting
            for v in g[u]:
                if v not in states:
                    if not dfs(v):
                        return False
                elif states[v] == visiting:
                    return False
            states[u] = visited
            stack.append(u)
            return True
        res = []
        for q in g:
            if q not in states:  # 已经判断过的不能再执行了,否则会在stack中append两次
                res.append(dfs(q))
        return "".join(reversed(stack)) if all(res) else ""  # 这里reverse是因为在深度或者说递归的时候,后面的先加入进去了,是反的,所以输出的时候倒序输出

在这里插入图片描述
在这里插入图片描述

在这里插入代码片class Solution:
    def alienOrder(self, words: List[str]) -> str:
        g = {}
        number = {}  # 用来统计入度的数量
        for c in words[0]:
            g[c] = []
            number[c] = 0
        for i in range(1, len(words)):
            s = words[i-1]
            t = words[i]
            for c in t:
                g.setdefault(c, [])
                number.setdefault(c, 0)
            flag = False
            for u, v in zip(s, t):
                if u != v:
                    g[u].append(v)
                    number[v] += 1
                    flag = True
                    break
            if not flag:
                if len(s) > len(t):
                    return ""

        # 从入度的角度
        queue = []
        res = []
        for k in number:
            if number[k] == 0:
                queue.append(k)
        while queue:
            cur = queue.pop(0)
            res.append(cur)
            for q in g[cur]:
                number[q] -= 1
                if number[q] == 0:  # 只有入度为0才能加入到队列中,表明他之前的都已经输出了,如果有环的话是输出不来的
                    queue.append(q)
        if len(res) == len(g):
            return "".join(res)
        else:
            return ""
LeetCode 图论 一】初探有向图Directed Graph 由于搜索是从随机的点开始的,我们将没有相邻节点的点入栈之后,再回溯到初始节点,将它入栈,但是后面的搜索也可能会碰到它。所以要给已经搜索的节点打上标签。 阅读详情

相关推荐

外星字典

外星字典这题其实还是拓扑排序的问题,拓扑排序问题就是解决有向图是否有环的.如果没有环则就是拓扑排序,否则就不是拓扑排序.同样,做这类题的思路就是:这道题里需要将外星字典中的每个字母看成一个节点,将字母之间的顺序关系看成有向边。对于外星字典中的两个相邻单词,同时从左到右遍历,当遇到第一个不相同的字母时,该位置的两个字母之间即存在顺序关系。以下两种情况不存在合法字母顺序:其余情况下都存在合法字母顺序,可以使用拓扑排序得到字典顺序。

Oblak_ZY的博客 389

剑指 Offer II 114. 外星字典(困难 图 bfs 哈希表 拓扑排序 字符串 数组)

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

weixin_43942435的博客 350

剑指 Offer II 114. 外星字典

LeetCode每日一题

昂昂累世士的博客 269

[LeetCode] LeetCode中与有向图相关的题目总结

章目录相关题743. 网络延迟时间 相关题 LeetCode有向图相关的题的题号为:743,685,684,399,332,310,210 743. 网络延迟时间 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

virgilshi的博客 1368

【综合笔试题】剑指 Offer II 114. 外星字典

题目描述 这是 LeetCode 上的 剑指 Offer II 114. 外星字典 ,难度为 困难。 Tag : 「图论」、「拓扑排序」、「建图」、「图论 BFS」 现有一种使用英语字母的外星语言,这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种

宫水三叶的刷题日记 1471

Leetcode 剑指 Offer II 114. 外星字典

题目难度: 困难今天继续更新 Leetcode剑指 Offer(专项突击版)系列, 大家在公众号里回复剑指offer2就能看到该系列当前连载的所有章了, 记得关注哦~

随便发挥的博客 657

LeetCode剑指 Offer II 114. 外星字典

剑指 Offer II 114. 外星字典

weixin_54106682的博客 1033

剑指 Offer II 114. 外星字典题解

一、题目描述 现有一种使用英语字母的外星语言,这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。 示例 1: 输入:words = ["wrt","wrf","er","ett","rftt"] 输出:"wertf" 示例

m0_61355190的博客 7335

golang力扣leetcode 剑指Offer II 114. 外星字典

剑指Offer II 114. 外星字典题目:这题题目属实写的跟屎一样,样例给的也有问题现在有一种外星,与a…z顺序不同,给出一个用外星构造的字符串列表。注意:字符串内部的字符排列,不是根据外星排序的字符串与字符串之间,谁排在前面,谁排在后面,是根据外星排序的请根据该字符串数组,还原出外星字典序。如果不存在合法字母顺序,返回”“,答案可能有多个,返回任意一个。在两个字符串相同下标的字符,称为ch1和ch2,在第二种情况中,排在前面的字符串,必定ch1 < ch2 。如果字符相同,len(word

清风 470

leetcode笔记(剑指 Offer II 114. 外星字典

题目来自leetcode可以采用回溯代换数字,然后进行数字排序,也可以直接采用拓扑排序,回溯代换数字的代码结构要比拓扑排序的复杂且复杂度要高,不过针对数据量少的数据集还是可以用的。

wweTHEUT的博客 1414

力扣 剑指 Offer II 114. 外星字典

BFS 解法 + DFS 解法

csdn_muxin的博客 299

​力扣解法汇总-剑指 Offer II 114. 外星字典

目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 现有一种使用英语字母的外星语言,这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序

分享+记录 487

[LeetCode]剑指 Offer II 114. 外星字典

题目 剑指 Offer II 114. 外星字典 剑指 Offer II 114. 外星字典 现有一种使用英语字母的外星语言,这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。 字符串 s 字典顺序小于 字符串 t 有两种情况:

wat1r的博客 194

Java&C++题解与拓展——leetcode剑指Offer II 114.外星字典拓扑排序

leetcode剑指Offer II 114.外星字典解题思路,用Java编写,并对所使用类和方法进行学习记录。

菜鸡成长之路 556

力扣——剑指 Offer II 114. 外星字典(图:拓扑排序

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

lllzzzhhh2589的记录 235

Leetcode剑指 Offer II 114. 外星字典

题目: 现有一种使用英语字母的外星语言,这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序 排列。若不存在合法字母顺序,返回 "" 。若存在多种可能的合法字母顺序,返回其中 任意一种 顺序即可。 字符串 s 字典顺序小于 字符串 t 有两种情况: 在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前

qq_35455503的博客 440

LeetCode每日一题(2022/5/31)剑指 Offer II 114. 外星字典(困难)

剑指 Offer II 114. 外星字典

FlamelNW的博客 239

入门力扣自学笔记48 C++ (题目编号:剑指Offer114)(多看看,未理解)

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

DK_Sorhic的博客 216

leetcode剑指 Offer II 114. 外星字典【setdefault + pairwise + for...else + 拓扑排序板子】

分析 首先来个dict使用setdefault把所有字母都存进去 然后用pairwise使得相邻的两个为一组,利用setdefault继续填满出现过的字母 然后遍历相邻的两个单词的位,使用for…else 如果存在某个位不一样,那么g[u].append(v)得到一个拓扑关系,并break不进入else 否则进入else,如果前面更长违反规则,返回空 拓扑排序板子: 三个状态:未访问,访问中,已访问 用states维护状态,用order模拟栈记录拓扑排序(最深的先放进去) dfs中首先先设置为访问中 然后.

小楼一夜听春雨 322
上一篇: leetcode 剑指offer11:旋转数组的最小数字
下一篇: leetcode 473:火柴拼正方形 回溯
coding_diamond
博客等级 码龄7年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值