สมมุติว่าเรามีสูตรเคมี เราต้องหาการนับของแต่ละอะตอม
องค์ประกอบอะตอมจะเริ่มต้นด้วยอักขระตัวพิมพ์ใหญ่เสมอ โดยอาจมีตัวอักษรตัวพิมพ์เล็กเป็นศูนย์หรือมากกว่านั้นแทนชื่อ และตัวเลข 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