मान लीजिए हमारे पास एक रासायनिक सूत्र है; हमें प्रत्येक परमाणु की गिनती ज्ञात करनी है।
एक परमाणु तत्व हमेशा एक अपरकेस वर्ण से शुरू होगा, नाम का प्रतिनिधित्व करने वाले शून्य या अधिक लोअरकेस अक्षर हो सकते हैं। और अगर गिनती 1 से अधिक है तो उस तत्व की गिनती का प्रतिनिधित्व करने वाले 1 या अधिक अंक अनुसरण कर सकते हैं, लेकिन यदि गिनती 1 है, तो कोई अंक नहीं आएगा। उदाहरण के तौर पर, H2O और H2O2 दोनों मान्य हैं, लेकिन H1O2 अमान्य है।
इसलिए, यदि इनपुट Na2(CO)3 जैसा है, तो आउटपुट C3Na2O3 होगा, इसलिए यह 3 कार्बन (C), 2 सोडियम (Na), 3 ऑक्सीजन (O) को इंगित करता है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन makeRet () को परिभाषित करें, इसमें एक नक्शा m लगेगा,
-
रिट:=खाली स्ट्रिंग
-
m -
. में प्रत्येक कुंजी-मान युग्म 'it' के लिए-
रिट :=रिट + इसकी कुंजी
-
यदि इसका मान> 1 है, तो -
-
ret :=ret + इसका मान स्ट्रिंग के रूप में
-
-
-
वापसी रिट
-
एक फ़ंक्शन को परिभाषित करें countOfAtoms(), इसमें s लगेंगे,
-
एक नक्शा परिभाषित करें मी
-
एक स्टैक सेंट परिभाषित करें
-
मैं :=0, n :=s का आकार
-
जबकि मैं
-
सी:=एस[i]
-
(मैं 1 से बढ़ाइए)
-
यदि c '(' के समान है, तो -
-
सेंट में मी डालें
-
मी :=एक मानचित्र परिभाषित करें
-
-
अन्यथा जब c ')' के समान हो, तब -
-
वैल:=0
-
जबकि (i
-
वैल:=वैल * 10 + (एस[i] - '0' का ASCII)
-
(मैं 1 से बढ़ाइए)
-
-
एक नक्शा अस्थायी परिभाषित करें:=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
m -
. में प्रत्येक कुंजी-मान युग्म 'it' के लिए-
इसका मूल्य :=इसका मूल्य * वैल
-
अस्थायी [इसकी कुंजी]:=अस्थायी [इसकी कुंजी] + इसका मूल्य
-
-
एम:=अस्थायी
-
-
अन्यथा
-
नाम:=खाली स्ट्रिंग
-
वैल:=0
-
नाम:=नाम + ग
-
जबकि (i
-
नाम:=नाम + एस[i]
-
(मैं 1 से बढ़ाइए)
-
-
जबकि (i
-
वैल:=वैल * 10 + (एस[i] - '0' का ASCII)
-
(मैं 1 से बढ़ाइए)
-
-
वैल:=(यदि वैल 0 के समान है, तो 1 अन्यथा वैल)
-
एम [नाम]:=एम [नाम] + वैल
-
-
-
वापसी makeRet(एम)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: string makeRet(map<string, int> m){ string ret = ""; for (auto& it : m) { ret += it.first; if (it.second > 1) { ret += to_string(it.second); } } return ret; } string countOfAtoms(string s){ map<string, int> m; stack<map<string, int> > st; int i = 0; int n = s.size(); while (i < n) { char c = s[i]; i++; if (c == '(') { st.push(m); m = map<string, int>(); } else if (c == ')') { int val = 0; while (i < n && s[i] >= '0' && s[i] <= '9') { val = val * 10 + (s[i] - '0'); i++; } map<string, int> temp = st.top(); st.pop(); for (auto& it : m) { it.second *= val; temp[it.first] += it.second; } m = temp; } else { string name = ""; int val = 0; name += c; while (i < n && s[i] >= 'a' && s[i] <= 'z') { name += s[i]; i++; } while (i < n && s[i] >= '0' && s[i] <= '9') { val = val * 10 + (s[i] - '0'); i++; } val = val == 0 ? 1 : val; m[name] += val; } } return makeRet(m); } }; main(){ Solution ob; cout << (ob.countOfAtoms("Na2(CO)3")); }
इनपुट
Na2(CO)3
आउटपुट
C3Na2O3