สมมติว่ามีภาษาต่างดาวใหม่และใช้อักษรละติน อย่างไรก็ตาม ลำดับระหว่างตัวอักษรไม่เป็นที่รู้จัก เรามีรายการคำที่ไม่เว้นว่างจากพจนานุกรม คำเหล่านี้จัดเรียงตามพจนานุกรมตามกฎของภาษาใหม่นี้ เราต้องหาลำดับตัวอักษรในภาษานี้
ดังนั้น หากอินพุตเป็น ["wrt","wrf","er", "ett", "rftt" ] เอาต์พุตจะเป็น "wertf"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งแผนที่เรียกว่าดีกรี
-
กำหนดหนึ่งแผนที่เรียกว่ากราฟ
-
n :=ขนาดของคำ
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของคำ อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
สำหรับการเริ่มต้น j :=0 เมื่อ j <ขนาดของคำ[i] อัปเดต (เพิ่ม j ทีละ 1) ให้ทำ -
-
องศา[คำ[i, j]] :=0
-
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
l :=ขนาดขั้นต่ำของคำ[i] และขนาดของคำ[i + 1]
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
x :=คำ[i, j]
-
y :=คำ[i + 1, j]
-
ถ้า x ไม่เท่ากับ y แล้ว −
-
แทรก y ที่ส่วนท้ายของกราฟ[x]
-
(เพิ่มดีกรี[y] ขึ้น 1)
-
ออกจากวง
-
-
-
-
ret :=สตริงว่าง
-
กำหนดหนึ่งคิว q
-
สำหรับแต่ละคีย์-ค่าจับคู่เป็นดีกรี ให้ทำ -
-
หากค่าเท่ากับ 0 แล้ว −
-
ใส่คีย์ของมันลงใน q
-
-
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
x :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
ret :=ret + x
-
สำหรับแต่ละองค์ประกอบนั่งในกราฟทำ -
-
ลดดีกรี[นั่ง] 1
-
ถ้าดีกรี[นั่ง] เท่ากับ 0 แล้ว −
-
แทรกนั่งลงใน q
-
-
(เพิ่มขึ้นนั่ง 1)
-
-
-
return (ถ้าขนาดของ 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