Leetcode 269. 火星詞典

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。與此同時…