C++ 外星词典


假设存在一种新的外星语言,它使用拉丁字母表。但是,字母之间的顺序是未知的。我们有一份来自词典的非空单词列表,这些单词按照这种新语言的规则按字典顺序排序。我们必须找到这种语言中字母的顺序。

因此,如果输入类似于 ["wrt","wrf","er", "ett", "rftt" ],则输出将为 "wertf"

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个名为 degree 的映射

  • 定义一个名为 graph 的映射

  • n := 单词的数量

  • 对于初始化 i := 0,当 i < 单词的数量 时,更新(i 增加 1),执行:

    • 对于初始化 j := 0,当 j < words[i] 的大小 时,更新(j 增加 1),执行:

      • degree[words[i, j]] := 0

  • 对于初始化 i := 0,当 i < n - 1 时,更新(i 增加 1),执行:

    • l := words[i] 的大小和 words[i + 1] 的大小的最小值

    • 对于初始化 j := 0,当 j < l 时,更新(j 增加 1),执行:

      • x := words[i, j]

      • y := words[i + 1, j]

      • 如果 x 不等于 y,则:

        • 将 y 插入到 graph[x] 的末尾

        • (degree[y] 增加 1)

        • 退出循环

  • ret := 空字符串

  • 定义一个队列 q

  • 对于 degree 中的每个键值对 it,执行:

    • 如果 it 的值为 0,则:

      • 将 it 的键插入到 q 中

  • 当 (q 不为空) 时,执行:

    • x := q 的第一个元素

    • 从 q 中删除元素

    • ret := ret + x

    • 对于 graph 中的每个元素 sit,执行:

      • degree[sit] 减 1

      • 如果 degree[sit] 等于 0,则:

        • 将 sit 插入到 q 中

      • (sit 增加 1)

  • 返回(如果 ret 的大小等于 degree 的大小,则返回 ret,否则返回空字符串)

示例

让我们看下面的实现来更好地理解:

在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string alienOrder(vector<string>& words) {
      map<char, int> degree;
      map<char, vector<char> > graph;
      int n = words.size();
      for (int i = 0; i < words.size(); i++) {
         for (int j = 0; j < words[i].size(); j++) {
            degree[words[i][j]] = 0;
         }
      }
      for (int i = 0; i < n - 1; i++) {
         int l = min((int)words[i].size(), (int)words[i + 1].size());
         for (int j = 0; j < l; j++) {
            char x = words[i][j];
            char y = words[i + 1][j];
            if (x != y) {
               graph[x].push_back(y);
               degree[y]++;
               break;
            }
         }
      }
      string ret = "";
      queue<char> q;
      map<char, int>::iterator it = degree.begin();
      while (it != degree.end()) {
         if (it->second == 0) {
            q.push(it->first);
         }
         it++;
      }
      while (!q.empty()) {
         char x = q.front();
         q.pop();
         ret += x;
         vector<char>::iterator sit = graph[x].begin();
         while (sit != graph[x].end()) {
            degree[*sit]--;
            if (degree[*sit] == 0) {
               q.push(*sit);
            }
            sit++;
         }
      }
      return ret.size() == degree.size() ? ret : "";
   }
};
main(){
   Solution ob;
   vector<string> v = {"wrt","wrf","er","ett","rftt"};
   cout <<(ob.alienOrder(v));
}

输入

{"wrt","wrf","er","ett","rftt"}

输出

wertf

更新于:2020-7-21

455 次浏览

启动您的 职业生涯

完成课程获得认证

开始学习
广告