라틴 알파벳을 사용하는 새로운 외계인 언어가 있다고 가정합니다. 그러나 글자 사이의 순서는 알 수 없습니다. 사전에서 비어 있지 않은 단어 목록이 있으며 이 단어는 이 새로운 언어의 규칙에 따라 사전순으로 정렬됩니다. 이 언어의 글자 순서를 찾아야 합니다.
따라서 입력이 ["wrt","wrf","er", "ett", "rftt" ]와 같으면 출력은 "wertf"
가 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
차수라는 하나의 지도 정의
-
그래프라는 하나의 맵 정의
-
n :=단어의 크기
-
for initialize i :=0, i <단어 크기일 때 업데이트(i 1 증가), −
-
j 초기화의 경우:=0, j <단어의 크기[i]일 때 업데이트(j를 1만큼 증가), 수행 -
-
학위[단어[i, j]] :=0
-
-
-
initialize i :=0의 경우, i
-
l :=단어의 최소 크기[i]와 단어의 크기[i + 1]
-
initialize j :=0의 경우 j
-
x :=단어[i, j]
-
y :=단어[i + 1, j]
-
x가 y와 같지 않으면 -
-
그래프[x]의 끝에 y를 삽입
-
(도[y]를 1씩 증가)
-
루프에서 나오세요
-
-
-
-
ret :=빈 문자열
-
하나의 대기열 정의 q
-
각 키-값 쌍에 대해 차수로 −
-
값이 0과 같으면 -
-
q에 키 삽입
-
-
-
동안(q가 비어 있지 않음) -
를 수행합니다.-
x :=q의 첫 번째 요소
-
q에서 요소 삭제
-
렛 :=렛 + x
-
그래프에 있는 각 요소에 대해 −
-
1도 감소[앉아]
-
학위[앉아]가 0과 같으면 -
-
q에 앉아
삽입
-
-
(앉아 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