假设有一种新的外语,并且使用拉丁字母。但是,字母之间的顺序未知。我们有一个字典中的非空单词列表,这些单词按照这种新语言的规则按字典顺序排序。我们必须找到这种语言的字母顺序。
因此,如果输入类似于[“ 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