라틴 알파벳을 사용하는 새로운 외계인 언어가 있다고 가정합니다. 그러나 글자 사이의 순서는 알 수 없습니다. 사전에서 비어 있지 않은 단어 목록이 있으며 이 단어는 이 새로운 언어의 규칙에 따라 사전순으로 정렬됩니다. 이 언어의 글자 순서를 찾아야 합니다.
따라서 입력이 ["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