1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class Solution { public: string countOfAtoms(string formula) { int k = 0; auto t = dfs(formula, k); string res; for (auto &[x, y] : t) { res += x; if (y > 1) res += to_string(y); } return res; } map<string, int> dfs(string &str, int &u) { map<string, int> res; while (u < str.size()) { if (str[u] == '(') { u++; auto t = dfs(str, u); u++; int cnt = 1, k = u; while (k < str.size() && isdigit(str[k])) k++; if (k > u) { cnt = stoi(str.substr(u, k - u)); u = k; } for (auto &[x, y] : t) res[x] += y * cnt; } else if (str[u] == ')') break; else { int k = u + 1; while (k < str.size() && str[k] >= 'a' && str[k] <= 'z') k++; auto key = str.substr(u, k - u); u = k; int cnt = 1; while (k < str.size() && isdigit(str[k])) k++; if (k > u) { cnt = stoi(str.substr(u, k - u)); u = k; } res[key] += cnt; } } return res; } };
|