สมมติว่าเรามีสูตรเคมี เราต้องหาจำนวนอะตอมแต่ละชนิด
ธาตุเริ่มต้นด้วยตัวพิมพ์ใหญ่ ตามด้วยตัวพิมพ์เล็ก 0 ตัวขึ้นไป และตัวเลข 1 ตัวขึ้นไปแทนจำนวน (ถ้าเป็น 1 จะไม่เขียนตัวเลข) เช่น H2O และ H2O2 ถูกต้อง แต่ H1O2 ผิด
เช่น Na2(CO)3 เอาต์พุตคือ C3Na2O3 หมายถึง คาร์บอน 3 โซเดียม 2 ออกซิเจน 3
วิธีแก้ − ใช้ Stack จัดการวงเล็บ และ Map นับจำนวนอะตอม
ตัวอย่าง
#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]; 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