একটি রাসায়নিক সূত্র দেওয়া থাকলে, প্রতিটি পরমাণুর সংখ্যা বের করতে হবে।
পরমাণুর নাম সর্বদা বড় হাতের অক্ষর দিয়ে শুরু হয়, এরপর ছোট হাতের অক্ষর থাকতে পারে। সংখ্যা ১-র চেয়ে বড় হলে শুধু তখন ডিজিট থাকে, ১ হলে ডিজিট থাকে না। যেমন: H2O এবং H2O2 বৈধ, কিন্তু H1O2 অবৈধ।
উদাহরণ
ইনপুট: Na2(CO)3 → আউটপুট: C3Na2O3
অর্থ: ৩টি কার্বন (C), ২টি সোডিয়াম (Na), ৩টি অক্সিজেন (O)।
সমাধানের ধাপসমূহ
- স্ট্যাক ব্যবহার করে ব্র্যাকেট হ্যান্ডেল করুন।
- প্রতিটি পরমাণু পാർസ করুন: নাম + ঐচ্ছিক সংখ্যা।
- ব্র্যাকেট খুললে বর্তমান ম্যাপ স্ট্যাকে পুশ করুন, নতুন ম্যাপ শুরু করুন।
- ব্র্যাকেট বন্ধ হলে গুণফল বের করে পাওয়ার ম্যাপে যোগ করুন।
- শেষে ম্যাপ থেকে স্ট্রিং বানান।
প্রোগ্রাম উদাহরণ
#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, n = s.size();
while (i < n) {
char c = s[i++];
if (c == '(') {
st.push(m);
m = map<string, int>();
}
else if (c == ')') {
int val = 0;
while (i < n && isdigit(s[i])) {
val = val * 10 + (s[i++] - '0');
}
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 = "";
name += c;
while (i < n && islower(s[i]))
name += s[i++];
int val = 0;
while (i < n && isdigit(s[i]))
val = val * 10 + (s[i++] - '0');
val = val == 0 ? 1 : val;
m[name] += val;
}
}
return makeRet(m);
}
};
int main() {
Solution ob;
cout << (ob.countOfAtoms("Na2(CO)3"));
}
ইনপুট
Na2(CO)3
আউটপুট
C3Na2O3