返回

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

后端

前言

在剑指 Offer II 114. 外星文字典中,您将面临一个由外星文字组成的字典,任务是根据给定的外星文字关系,重建这个外星文字字典的正确顺序。为了解决这个问题,我们将借助建图和拓扑排序两种重要的算法技术。

问题分析

首先,我们需要理解题目的要求和给定的信息。题目提供了一个包含外星文字关系的数组,每个关系由一对字符组成,表示第一个字符必须在第二个字符之前出现。例如,如果给定关系 "A"->"B",则意味着在字典中,字符 "A" 必须排在字符 "B" 之前。

解题思路

  1. 建图: 我们将给定的外星文字关系视为有向图中的边。我们将每个外星文字作为一个节点,并将它们之间的关系作为有向边。

  2. 拓扑排序: 我们将使用拓扑排序算法来找到字典中外星文字的正确顺序。拓扑排序可以帮助我们找到有向图中所有节点的顺序,使得对于每条边,它的起点节点都排在终点节点之前。

算法步骤

  1. 创建图: 首先,我们将给定的外星文字关系转换为一个有向图。我们将每个外星文字视为一个节点,并为每个关系创建一个有向边。

  2. 计算入度: 接下来,我们将计算每个节点的入度。入度是指进入该节点的有向边的数量。

  3. 找到起点: 在拓扑排序中,起点是指入度为 0 的节点。这些节点没有其他节点指向它们,因此它们可以作为排序的起点。

  4. 拓扑排序: 从起点开始,我们将依次访问每个节点并将其从图中删除。当我们删除一个节点时,我们将更新其相邻节点的入度。如果某个节点的入度变为 0,则它将成为新的起点。

  5. 输出结果: 重复步骤 4,直到所有节点都从图中删除。此时,我们已经获得了外星文字字典的正确顺序。

代码实现

def alien_order(words):
  # 创建图
  graph = {}
  for word in words:
    for i in range(len(word)):
      if word[i] not in graph:
        graph[word[i]] = set()

  # 计算入度
  in_degree = {}
  for word in words:
    for i in range(len(word)):
      in_degree[word[i]] = 0

  # 为每个关系创建边
  for i in range(len(words)):
    for j in range(i + 1, len(words)):
      word1, word2 = words[i], words[j]
      for k in range(min(len(word1), len(word2))):
        if word1[k] != word2[k]:
          graph[word1[k]].add(word2[k])
          in_degree[word2[k]] += 1
          break

  # 拓扑排序
  result = []
  queue = []
  for node in graph:
    if in_degree[node] == 0:
      queue.append(node)

  while queue:
    node = queue.pop(0)
    result.append(node)
    for neighbor in graph[node]:
      in_degree[neighbor] -= 1
      if in_degree[neighbor] == 0:
        queue.append(neighbor)

  # 检查是否有环
  if len(result) != len(graph):
    return ""

  # 返回结果
  return "".join(result)

结语

在本文中,我们详细介绍了如何利用建图和拓扑排序解决剑指 Offer II 114. 外星文字典这道难题。通过将外星文字关系转化为有向图,并使用拓扑排序算法,我们能够找到外星文字字典的正确顺序。希望本文对您理解和解决这道难题有所帮助。