मान लीजिए हमारे पास शब्दों की एक सरणी है, हमें अंग्रेजी वर्णमाला में कोई वर्णमाला क्रम ढूंढना है ताकि दिए गए शब्दों को आरोही क्रम में सॉर्टेड माना जा सके, यदि ऐसा कोई क्रम मौजूद है, अन्यथा "impossible" लौटाएं।
तो, यदि इनपुट words = ["efgh", "wxyz"] जैसा है, तो आउटपुट zyxvutsrqponmlkjihgfewdcba होगा
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे −
<उल क्लास="सूची"><ली>ALPHABET := 26ली><ली>n := v का आकारली><ली>यदि n 1 के समान है, तो −<उल क्लास="सूची"><ली>"abcdefghijklmnopqrstuvwxyz" प्रदर्शित करेंली><ली>लौटेंली>उल>ली><ली>ALPHABET आकार का एक सरणी adj परिभाषित करेंली><ली>ALPHABET आकार का एक सरणी in परिभाषित करें और 0 से भरेंली><ली>pre := v[0]ली><ली>i := 1 से इनिशियलाइज़ करें, जब i < n, अपडेट करें (i को 1 से बढ़ाएं), तब तक करें −<उल क्लास="सूची"><ली>s := v[i]ली><ली>j को 0 से minimum of (pre का आकार और s का आकार) - 1 तक की रेंज में −<उल क्लास="सूची"><ली>यदि s[j], pre[j] के बराबर नहीं है, तो −<उल क्लास="सूची"><ली>लूप से बाहर आएंली>उल>ली><ली>यदि j < pre के आकार और s के आकार के न्यूनतम के बराबर है, तो −<उल क्लास="सूची"><ली>s[j] - 'a' का ASCII को adj[pre[j] - 'a' का ASCII] के अंत में डालेंली>उल><ली>in[s[j] - 'a' का ASCII] को 1 से बढ़ाएंली><ली>pre := sली><ली>निम्नलिखित भाग को अनदेखा करें, अगली पुनरावृत्ति पर जाएंली>उल>ली><ली>यदि pre का आकार > s का आकार, तो −<उल क्लास="सूची"><ली>"Impossible" प्रदर्शित करेंली><ली>लौटेंली>उल>ली><ली>pre := sली>उल>ली><ली>एक स्टैक my_stack परिभाषित करेंली><ली>i := 0 से इनिशियलाइज़ करें, जब i < ALPHABET, अपडेट करें (i को 1 से बढ़ाएं), तब तक करें −<उल क्लास="सूची"><ली>यदि in[i] 0 के समान है, तो −<उल क्लास="सूची"><ली>i को my_stack में डालेंली>उल><ली>out नामक एक सरणी परिभाषित करेंउल>ली><ली>26 आकार का एक सरणी vis परिभाषित करें। false से भरेंली><ली>जब तक (my_stack खाली नहीं है), तब तक करें −<उल क्लास="सूची"><ली>x := my_stack का शीर्ष तत्वली><ली>my_stack से तत्व हटाएंली><ली>vis[x] := true<ली>x + 'a' का ASCII को out के अंत में डालेंली><ली>i := 0 से इनिशियलाइज़ करें, जब i < adj[x] का आकार, अपडेट करें (i को 1 से बढ़ाएं), तब तक करें −<उल क्लास="सूची"><ली>यदि vis[adj[x, i]] शून्येतर है, तो −<उल क्लास="सूची"><ली>निम्नलिखित भाग को अनदेखा करें, अगली पुनरावृत्ति पर जाएंली>उल><ली>(in[adj[x, i]] को 1 से घटाएं)ली><ली>यदि in[adj[x, i]] 0 के समान है, तो −<उल क्लास="सूची"><ली>adj[x, i] को my_stack में डालेंली>उल>उल>ली><ली>i := 0 से इनिशियलाइज़ करें, जब i < ALPHABET, अपडेट करें (i को 1 से बढ़ाएं), तब तक करें −<उल क्लास="सूची"><ली>यदि not vis[i] शून्येतर है, तो −<उल क्लास="सूची"><ली>"Impossible" प्रदर्शित करेंली>उल><ली>लौटेंली>उल>ली><ली>i := 0 से इनिशियलाइज़ करें, जब i < out का आकार, अपडेट करें (i को 1 से बढ़ाएं), तब तक करें −<उल क्लास="सूची"><ली>out[i] प्रदर्शित करेंली>उल>उल>उदाहरण
बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें −
<प्रि क्लास="प्रिटीप्रिंट नोट्रांसलेट">#include <bits/stdc++.h> using namespace std; #define ALPHABET 26 void search_ordering(vector<string> v) { int n = v.size(); if (n == 1) { cout << "abcdefghijklmnopqrstuvwxyz"; return; } vector<int> adj[ALPHABET]; vector<int> in(ALPHABET, 0); string pre = v[0]; for (int i = 1; i < n; ++i) { string s = v[i]; int j; for (j = 0; j < min(pre.length(), s.length()); ++j) if (s[j] != pre[j]) break; if (j < min(pre.length(), s.length())) { adj[pre[j] - 'a'].push_back(s[j] - 'a'); in[s[j] - 'a']++; pre = s; continue; } if (pre.length() > s.length()) { cout << "Impossible"; return; } pre = s; } stack<int> my_stack; for (int i = 0; i < ALPHABET; ++i) if (in[i] == 0) my_stack.push(i); vector<char> out; bool vis[26]; memset(vis, false, sizeof(vis)); while (!my_stack.empty()) { char x = my_stack.top(); my_stack.pop(); vis[x] = true; out.push_back(x + 'a'); for (int i = 0; i < adj[x].size(); ++i) { if (vis[adj[x][i]]) continue; in[adj[x][i]]--; if (in[adj[x][i]] == 0) my_stack.push(adj[x][i]); } } for (int i = 0; i < ALPHABET; ++i) if (!vis[i]) { cout << "Impossible"; return; } for (int i = 0; i < out.size(); ++i) cout << out[i]; } int main() { vector<string> v{"efgh", "wxyz"}; search_ordering(v); }इनपुट
{"efgh", "wxyz"}आउटपुट
zyxvutsrqponmlkjihgfewdcba