C ++外来字典

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

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

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

  • 定义一张称为学位的映射

  • 定义一张称为图的映射

  • n:=字数

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

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

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

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

      • x:=单词[i,j]

      • y:=单词[i + 1,j]

      • 如果x不等于y,则-

      • 在图形[x]的末尾插入y

      • (将[y]的度数增加1)

      • 从循环中出来

      • l:=单词[i]的最小大小和单词[i + 1]的最小大小

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

      • ret:=空字符串

      • 定义一个队列q

      • 对于每个键值对的度数,请执行-

        • 将其插入q

        • 如果其值等于0,则-

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

        • 降低度[坐] 1

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

        • (增加坐位1)

        • 插入q

        • x:= q的第一个元素

        • 从q删除元素

        • ret:= ret + x

        • 对于坐在图中的每个元素-

        • 返回(如果ret的大小与度的大小相同,则返回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