Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 외계인 사전

<시간/>

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

따라서 입력이 ["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