สมมุติว่าเรามีสูตรเคมี เราต้องหาการนับของแต่ละอะตอม
องค์ประกอบอะตอมจะเริ่มต้นด้วยอักขระตัวพิมพ์ใหญ่เสมอ โดยอาจมีตัวอักษรตัวพิมพ์เล็กเป็นศูนย์หรือมากกว่านั้นแทนชื่อ และตัวเลข 1 ตัวขึ้นไปแทนการนับขององค์ประกอบนั้นอาจตามมาหากการนับมากกว่า 1 แต่ถ้านับเป็น 1 ตัวเลขจะไม่ตามมา ตัวอย่างเช่น H2O และ H2O2 ถูกต้อง แต่ H1O2 ไม่ถูกต้อง
ดังนั้น หากอินพุตเป็นเหมือน Na2(CO)3 เอาต์พุตจะเป็น C3Na2O3 ดังนั้น นี่จึงหมายถึง 3 คาร์บอน (C), 2 โซเดียม (Na), 3 ออกซิเจน (O)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน makeRet() ซึ่งจะใช้เวลาหนึ่งแผนที่ m
-
ret :=สตริงว่าง
-
สำหรับแต่ละคู่คีย์-ค่า 'มัน' ในหน่วย m -
-
ret :=ret + คีย์ของมัน
-
ถ้าค่าของมัน> 1 แล้ว −
-
ret :=ret + ค่าของมันเป็นสตริง
-
-
-
รีเทิร์น
-
กำหนดฟังก์ชัน countOfAtoms() ซึ่งจะใช้เวลา s
-
กำหนดหนึ่งแผนที่ m
-
กำหนดหนึ่งสแต็ก st
-
ผม :=0, n :=ขนาดของ s
-
ในขณะที่ฉัน
-
c :=s[i]
-
(เพิ่ม i ขึ้น 1)
-
ถ้า c เหมือนกับ '(' แล้ว −
-
ใส่ m เข้าไปใน st
-
m :=กำหนดหนึ่งแผนที่
-
-
มิฉะนั้นเมื่อ c เหมือนกับ ')' แล้ว −
-
ค่า :=0
-
ในขณะที่ (i
-
val :=val * 10 + (s[i] - ASCII ของ '0')
-
(เพิ่ม i ขึ้น 1)
-
-
กำหนดหนึ่งอุณหภูมิแผนที่ :=องค์ประกอบด้านบนของ st
-
ลบองค์ประกอบออกจาก st
-
สำหรับแต่ละคู่คีย์-ค่า 'มัน' ในหน่วย m -
-
ค่าของมัน :=ค่าของมัน * val
-
temp[key of it] :=temp[key of it] + ค่าของมัน
-
-
m :=อุณหภูมิ
-
-
มิฉะนั้น
-
ชื่อ :=สตริงว่าง
-
ค่า :=0
-
ชื่อ :=ชื่อ + ค
-
ในขณะที่ (i
-
ชื่อ :=ชื่อ + s[i]
-
(เพิ่ม i ขึ้น 1)
-
-
ในขณะที่ (i
-
val :=val * 10 + (s[i] - ASCII ของ '0')
-
(เพิ่ม i ขึ้น 1)
-
-
val :=(ถ้า val เหมือนกับ 0, แล้ว 1 มิฉะนั้น val)
-
m[name] :=m[name] + val
-
-
-
ส่งคืน 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