समस्या
C++ में RAII संसाधन को ऑब्जेक्ट की लाइफ़टाइम से जोड़ता है: ऑब्जेक्ट के स्कोप से बाहर जाते ही संसाधन अपने आप रिलीज़ हो जाता है। एक ही स्कोप के ऑब्जेक्ट बनने के उल्टे क्रम में नष्ट होते हैं।
इवेंट को क्रम से प्रोसेस करें:
{: एक नए अंदरूनी स्कोप में जाएँ।}: मौजूदा स्कोप छोड़ें; उसमें लिया गया हर संसाधन रिलीज़ होता है, सबसे नया पहले।acquire <name>: मौजूदा स्कोप में एक संसाधन बनाएँ।
इवेंट खत्म होने पर बचे हुए खुले स्कोप सबसे अंदर वाले से सबसे बाहर वाले तक (प्रोग्राम का बाहरी स्कोप भी) इसी तरह संसाधन रिलीज़ करते हुए खत्म होते हैं।
raii_release_order(events) लिखें।
इनपुट
events: इवेंट। ब्रैकेट संतुलित होते हैं या खुले रह जाते हैं, बिना खोले कभी बंद नहीं होते।
आउटपुट
संसाधनों के नाम उसी क्रम में लौटाएँ जिसमें वे रिलीज़ होते हैं।
सीमाएँ
0 ≤ इवेंट की संख्या ≤ 100,000
नाम 1 से 20 कैरेक्टर के, बिना स्पेस
उदाहरण
इनपुट:
events = ["acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"]
अपेक्षित आउटपुट:
expected = ["lock", "file", "log", "db"]
इनपुट:
std::vector<std::string> events = {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
अपेक्षित आउटपुट:
std::vector<std::string> expected = {"lock", "file", "log", "db"};
इनपुट:
string[] events = new string[] {"acquire db", "{", "acquire file", "acquire lock", "}", "acquire log"};
अपेक्षित आउटपुट:
string[] expected = new string[] {"lock", "file", "log", "db"};
व्याख्या
अंदरूनी स्कोप छोड़ने पर पहले lock फिर file रिलीज़ होते हैं (सबसे नया पहले)। अंत में बाहरी स्कोप पहले log फिर db रिलीज़ करता है: ["lock", "file", "log", "db"]।
इनपुट:
events = ["{", "acquire a", "{", "acquire b"]
अपेक्षित आउटपुट:
expected = ["b", "a"]
इनपुट:
std::vector<std::string> events = {"{", "acquire a", "{", "acquire b"};
अपेक्षित आउटपुट:
std::vector<std::string> expected = {"b", "a"};
इनपुट:
string[] events = new string[] {"{", "acquire a", "{", "acquire b"};
अपेक्षित आउटपुट:
string[] expected = new string[] {"b", "a"};
व्याख्या
अंत में दो स्कोप खुले हैं: सबसे अंदर वाला b रिलीज़ करता है, फिर अगला a: ["b", "a"]।
कैसे हल करें
पहले खुद कोशिश करें, फिर एक-एक करके संकेत खोलें।
संकेत 1
स्कोप का एक स्टैक रखें, हर स्कोप अपने संसाधन क्रम से रखे।
संकेत 2
स्कोप बंद करने पर संसाधन सबसे नए से सबसे पुराने तक छूटते हैं।
संकेत 3
आख़िर में सभी खुले स्कोप बंद करें, सबसे अंदर वाले से शुरू करके।
अपेक्षित जटिलता
समय O(इवेंट की संख्या), अतिरिक्त स्थान O(इवेंट की संख्या)
संदर्भ
यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।