1.题目基本信息

1.1.题目描述

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

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

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

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

  • 在第一个不同字母处,如果 s 中的字母在这门外星语言的字母顺序中位于 t 中字母之前,那么 s 的字典顺序小于 t 。

  • 如果前面 min(s.length, t.length) 字母都相同,那么 s.length < t.length 时,s 的字典顺序也小于 t 。

1.2.题目地址

https://leetcode.cn/problems/alien-dictionary/description/

2.解题方法

2.1.解题思路

kahn算法 / DFS

2.2.解题步骤

kahn算法进行拓扑排序步骤

  • 第一步,根据"有序"的words数组构建各个字符之间的有向图,使用邻接表进行存储;并在建图的过程中统计各个结点的入度信息到inDegree哈希表中

    • 1.1.将所有字符都初始化到图中,并初始化它们入度为0

    • 1.2.遍历相邻单词组,构建图,并填充入度到inDegree哈希表

      • 1.2.1.将边添加到图中

      • 1.2.2.统计入度

      • 1.2.3.word1和word2的前缀相同且word1的长度大于word2的长度是不合法的情况,直接返回空字符串

  • 第二步,kahn算法进行拓扑排序。先判断图中是否有环,如果无环,返回任意一个拓扑排序的序列,如果有环,返回空字符串

    • 2.1.将入度为0的结点添加到队列中,并初始化拓扑排序序列数组

    • 2.2.kahn算法进行拓扑排序

  • 第三步,如果inDegree中所有结点的入度都为0,说明无环

DFS算法步骤

  • 第一步,构建出现的字母集合

  • 第二步,构建有向图的邻接表和入度字典

  • 第三步,DFS进行拓扑排序

3.解题代码

kahn算法版本代码

from collections import defaultdict, dequeclass Solution:def alienOrder(self, words: List[str]) -> str:# 思路:拓扑排序# 第一步,根据"有序"的words数组构建各个字符之间的有向图,使用邻接表进行存储;并在建图的过程中统计各个结点的入度信息到inDegree哈希表中graph = defaultdict(list)inDegree = defaultdict(int)# 1.1.将所有字符都初始化到图中,并初始化它们入度为0charsSet = set()for w in words:for c in w:charsSet.add(c)for c in charsSet:graph[c] = []inDegree[c] = 0# 1.2.遍历相邻单词组,构建图,并填充入度到inDegree哈希表n = len(words)for i in range(1, n):word1, word2 = words[i - 1], words[i]j = 0length1, length2 = len(word1), len(word2)while j < min(length1, length2):if word1[j] != word2[j]:# 1.2.1.将边添加到图中graph[word1[j]].append(word2[j])# 1.2.2.统计入度inDegree[word2[j]] += 1breakj += 1# 1.2.3.word1和word2的前缀相同且word1的长度大于word2的长度是不合法的情况,直接返回空字符串if j == min(length1, length2) and length1 > length2:return ""# print(graph)# print(inDegree)# 第二步,kahn算法进行拓扑排序。先判断图中是否有环,如果无环,返回任意一个拓扑排序的序列,如果有环,返回空字符串# 2.1.将入度为0的结点添加到队列中,并初始化拓扑排序序列数组arr = []    # 拓扑排序的序列que = deque()for node in graph.keys():if inDegree[node] == 0:que.append(node)arr.append(node)# 2.2.kahn算法进行拓扑排序while que:for _ in range(len(que)):node = que.popleft()del inDegree[node]for neighNode in graph[node]:inDegree[neighNode] -= 1if inDegree[neighNode] == 0:que.append(neighNode)arr.append(neighNode)# print(inDegree, arr)# 第三步,如果inDegree中所有结点的入度都为0,说明无环result = "".join(arr) if len(inDegree) == 0 else ""return result

dfs算法版本代码

from collections import defaultdict, dequeclass Solution:# 思路一:DFSdef alienOrder(self, words: List[str]) -> str:length=len(words)# 构建出现的字母集合lettersSet=set()for word in words:for letter in word:lettersSet.add(letter)# 构建图、入度字典graph={letter:[] for letter in lettersSet}inDict=defaultdict(int)for i in range(1,length):preWord=words[i-1]word=words[i]isNormalEnd=Truefor preLetter,letter in zip(preWord,word):# print(preLetter,letter)if preLetter!=letter:graph[preLetter].append(letter)inDict[letter]+=1isNormalEnd=Falsebreakif isNormalEnd:# print("t4",preWord,word)if len(preWord)>len(word):return ""# print("t1",graph,inDict,lettersSet)# dfsvisiting=set()visited=set()stack=[]# 返回True代表无环def dfs(node):if node in visited:return Trueif node in visiting:return Falsevisiting.add(node)for subNode in graph[node]:noCircle=dfs(subNode)if not noCircle:return Falsevisiting.remove(node)visited.add(node)stack.append(node)return Truefor node in list(graph.keys()):noCircle=dfs(node)if not noCircle:return ""return "".join(stack[::-1])

4.执行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/83174.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/83174.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/83174.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用vscode进行c/c++开发的时候,输出报错乱码、cpp文件本身乱码的问题解决

使用vscode进行c/c开发的时候&#xff0c;输出报错乱码、cpp文件本身乱码的问题解决 问题描述解决方案问题1的解决方案问题2解决方案 问题描述 本篇文章解决两个问题&#xff1a; 1.当cpp文件出现错误的时候&#xff0c;编译时报错&#xff0c;但是报错内容缺是乱码&#xff0…

现代数据湖架构全景解析:存储、表格式、计算引擎与元数据服务的协同生态

本文全面剖析现代数据湖架构的核心组件,深入探讨对象存储(OSS/S3)、表格式(Iceberg/Hudi/Delta Lake)、计算引擎(Spark/Flink/Presto)及元数据服务(HMS/Amoro)的协作关系,并提供企业级选型指南。 一、数据湖架构演进与核心价值 数据湖架构演进历程 现代数据湖核心价…

主数据编码体系全景解析:从基础到高级的编码策略全指南

在数字化转型的浪潮中&#xff0c;主数据管理&#xff08;MDM&#xff09;已成为企业数字化转型的基石。而主数据编码作为MDM的核心环节&#xff0c;其设计质量直接关系到数据管理的效率、系统的可扩展性以及业务决策的准确性。本文将系统性地探讨主数据编码的七大核心策略&…

Mac电脑上本地安装 MySQL并配置开启自启完整流程

文章目录 一、mysql安装1.1 使用 Homebrew 安装&#xff08;推荐&#xff09;1.2 手动下载 MySQL 社区版1.3 常见问题1.4 图形化管理工具&#xff08;可选&#xff09; 二、Mac 上配置 MySQL 开机自动启动2.1 使用 launchd 系统服务&#xff08;原生支持&#xff09;2.2 通过 H…

SQL Server 事务详解:概念、特性、隔离级别与实践

一、事务的基本概念 事务&#xff08;Transaction&#xff09;是数据库操作的基本单位&#xff0c;它是由一组SQL语句组成的逻辑工作单元。事务具有以下关键特性&#xff0c;通常被称为ACID特性&#xff1a; ​​原子性&#xff08;Atomicity&#xff09;​​&#xff1a;事务…

【C语言极简自学笔记】项目开发——扫雷游戏

一、项目概述 1.项目背景 扫雷是一款经典的益智游戏&#xff0c;由于它简单而富有挑战性的玩法深受人们喜爱。在 C 语言学习过程中&#xff0c;开发扫雷游戏是一个非常合适的实践项目&#xff0c;它能够综合运用 C 语言的多种基础知识&#xff0c;如数组、函数、循环、条件判…

unix/linux source 命令,其发展历程详细时间线、由来、历史背景

追本溯源,探究技术的历史背景和发展脉络,能够帮助我们更深刻地理解其设计哲学和存在的意义。source 命令(或者说它的前身和等效形式)的历史,与 Unix Shell 本身的发展紧密相连。 让我们一起踏上这段追溯之旅,探索 source 命令的由来和发展历程。 早期 Unix Shell 与命令…

720全景展示:VR全景的技术原理及应用

VR720全景展示&#xff1a;技术原理及应用探索 720全景技术&#xff0c;作为当前全球范围内迅速崛起流行的视觉新技术&#xff0c;为用户带来了全新的真实现场感和交互式的体验。凭借全方位、无死角的视觉展示特性&#xff0c;在VR&#xff08;虚拟现实&#xff09;领域中得到…

Python爬虫实战:研究Requests-HTML库相关技术

1. 引言 1.1 研究背景与意义 随着互联网数据量的爆炸式增长,网络爬虫已成为数据获取的重要工具,广泛应用于市场调研、舆情分析、学术研究等领域。传统爬虫技术在面对现代 JavaScript 动态渲染网页时面临挑战,而 Requests-HTML 库通过集成浏览器渲染引擎,为解决这一问题提…

VectorStore 组件深入学习与检索方法

考虑到目前市面上的向量数据库众多&#xff0c;每个数据库的操作方式也无统一标准&#xff0c;但是仍然存在着一些公共特征&#xff0c;LangChain 基于这些通用的特征封装了 VectorStore 基类&#xff0c;在这个基类下&#xff0c;可以将方法划分成 6 种&#xff1a; 相似性搜…

【PyQt5】从零开始的PyQt5 - QLabel篇

从零开始的PyQt5 - QLabel篇 引言一、简述二、例程2.1 显示到QWidget窗口上2.2 重新设置Label大小和对齐方式2.3 添加内容&#xff0c;设置边框2.4 显示富文本 三、参考 引言 QLabel主要用于显示文本或图像&#xff0c;不提供用户交互功能。本文主要简述PyQt5中的QLabel以及展…

论文略读:Uncertainty-Aware Graph Structure Learning

WWW 2025 1 intro 传统GNN忽视了图结构自身存在的缺陷: 图结构常常会出现错误边和缺失边等数据问题&#xff0c;从而限制模型的效果 —>为了解决上述问题&#xff0c;产生了图结构学习算法&#xff08;GSL&#xff09; 目的在于优化结点连接和边权重来生成新的邻接矩阵主流…

HCIE-STP复习

文章目录 STP STP &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Datacom专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年05月31日13点17STP通过三要素选举消除环路&#xff1a; 根桥&#xff08;BID最小&#xff0c;建议设优先级为0&…

leetcode17.电话号码的字母组合:字符串映射与回溯的巧妙联动

一、题目深度解析与字符映射逻辑 题目描述 给定一个仅包含数字 2-9 的字符串 digits&#xff0c;返回所有它能表示的字母组合。数字与字母的映射关系如下&#xff08;与电话按键相同&#xff09;&#xff1a; 2: "abc", 3: "def", 4: "ghi", …

【Unity】模型渐变技术 BlendShapes变形

模型fbx拖拽到场景并赋予脚本上SkinnedMeshRenderer参数 按下空格即可演示渐变 可去到3DsMax 或 Blender等软件制作 这种带有BlendShapes的模型 (Sphere002)是另一个模型&#xff0c;3DsMax叫变形器。 可参考&#xff1a;【技术美术百人计划】美术 3.5 BlendShape基础_哔哩哔哩…

CTFHub-RCE 命令注入-无过滤

观察源代码 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 发现除了index.php文件外&#xff0c;还存在一个可疑的文件 打开flag文件 我们尝试打开这个文件 127.0.0.1|cat 19492844826916.php 可是发现 文本内容显示不出来&…

DrissionPage ChromiumPage模式:浏览器自动化的高效利器

引言 在Python自动化领域&#xff0c;Selenium与Requests是开发者耳熟能详的工具&#xff0c;但二者在功能侧重上存在明显割裂。DrissionPage的出现打破了这一局面&#xff0c;其创新的ChromiumPage模式通过整合浏览器自动化与HTTP请求能力&#xff0c;为网页操作提供了全新解…

uniapp分包配置,uniapp设置subPackages

在使用uniapp开发过程中&#xff0c;由于项目比较大&#xff0c;无法直接上传&#xff0c;需要分包后才可以上传。 步骤&#xff1a; 1、在pages同级目录下创建分包的目录&#xff08;pages_second&#xff09;&#xff0c;把要分包的文件放到该目录下&#xff1b; 2、在pag…

零基础一站式端游内存辅助编写教程(无密)

目录如下&#xff1a; 基础理论篇 内存基础概念&#xff08;如内存地址、数据类型、读写原理&#xff09;端游内存机制简介&#xff08;游戏进程与内存分配&#xff09; 工具与环境搭建 常用内存分析工具介绍&#xff08;如 Cheat Engine、x64dbg 等&#xff09;开发环境配…

汽车售后诊断数据流详细分析

一、引言 随着汽车电子化程度的不断提升&#xff0c;电控系统已成为车辆运行的核心支撑。据罗兰贝格 2025 年智能汽车白皮书数据显示&#xff0c;中央计算 区域控制架构&#xff08;Zonal EEA&#xff09;的普及率已突破 58%&#xff0c;推动整车线束成本下降 41%12。与此同时…