ধরুন আমাদের একটি রাসায়নিক সূত্র আছে; আমাদের প্রতিটি পরমাণুর গণনা বের করতে হবে।
একটি পারমাণবিক উপাদান সর্বদা একটি বড় হাতের অক্ষর দিয়ে শুরু হবে, সেখানে শূন্য বা তার বেশি ছোট হাতের অক্ষর থাকতে পারে, নামের প্রতিনিধিত্ব করে। এবং 1 বা ততোধিক সংখ্যা সেই উপাদানের গণনার প্রতিনিধিত্ব করে যদি গণনা 1 এর চেয়ে বেশি হয় তবে অনুসরণ করা যেতে পারে। কিন্তু যদি গণনা 1 হয় তবে কোন সংখ্যা অনুসরণ করা হবে না। উদাহরণ হিসাবে, H2O এবং H2O2 উভয়ই বৈধ, কিন্তু H1O2 অবৈধ৷
সুতরাং, যদি ইনপুট Na2(CO)3 এর মত হয়, তাহলে আউটপুট হবে C3Na2O3, তাই এটি 3 কার্বন (C), 2 সোডিয়াম (Na), 3 অক্সিজেন (O) নির্দেশ করে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন makeRet() সংজ্ঞায়িত করুন, এটি একটি মানচিত্র m,
লাগবে -
ret :=ফাঁকা স্ট্রিং
-
প্রতিটি কী-মানের জোড়ার জন্য m −
-এ 'it'-
ret :=ret + এর কী
-
যদি এর মান> 1 হয়, তাহলে −
-
ret :=ret + স্ট্রিং হিসাবে এর মান
-
-
-
রিটার্ন রিটার্ন
-
একটি ফাংশন countOfAtoms() সংজ্ঞায়িত করুন, এটি s,
লাগবে -
একটি মানচিত্র m
সংজ্ঞায়িত করুন -
একটি স্ট্যাক স্ট্যাক সংজ্ঞায়িত করুন
-
i :=0, n :=s
এর আকার -
যখন i
-
c :=s[i]
-
(i 1 দ্বারা বাড়ান)
-
যদি c '(' এর মত হয়, তাহলে −
-
st
-এ m ঢোকান -
m :=একটি মানচিত্র সংজ্ঞায়িত করুন
-
-
অন্যথায় যখন c ')' এর মত হয়, তখন −
-
val :=0
-
যখন (i
করুন -
val :=val * 10 + (s[i] - ASCII of '0')
-
(i 1 দ্বারা বাড়ান)
-
-
একটি মানচিত্র তাপমাত্রা সংজ্ঞায়িত করুন :=st এর শীর্ষ উপাদান
-
st
থেকে উপাদান মুছুন -
প্রতিটি কী-মানের জোড়ার জন্য m −
-এ 'it'-
এর মান :=এর মান * ভ্যাল
-
temp[এর কী] :=temp[এর কী] + এর মান
-
-
m :=temp
-
-
অন্যথায়
-
নাম :=ফাঁকা স্ট্রিং
-
val :=0
-
নাম :=নাম + c
-
যখন (i
-
নাম :=নাম + s[i]
-
(i 1 দ্বারা বাড়ান)
-
-
যখন (i
করুন -
val :=val * 10 + (s[i] - ASCII of '0')
-
(i 1 দ্বারা বাড়ান)
-
-
val :=(যদি val 0 এর মত হয়, তাহলে 1, অন্যথায় val)
-
m[নাম] :=m[নাম] + ভাল
-
-
-
makeRet(m)
ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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