LeetCode 726 原子的数量[Map 栈] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 726 原子的数量[Map 栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
凡是与括号有关的就能联想到递归,用到递归就可以想到栈,本题使用哈希表栈的方式实现,总体来说思路还是很清晰的,如果不用哈希表栈可能需要两个栈去实现,就变得复杂了,思路如下:
- 编写获取元素的函数和获取数字的函数;
- 构建哈希表栈,首先将空的哈希表放进去;
- 遍历化学表达式,如果遇到“(”就放空的哈希表进去,如果是“)”就把当前的哈希表取出并更新到栈顶,否则一步步统计元素的数量;
- 遍历完成后取出栈顶(这个时候所有元素都统计完成),放入vector中进行排序;
- 排序结果放入res字符串中,返回该字符串。
代码如下:
class Solution {
public:
string countOfAtoms(string formula) {
stack<unordered_map<string, int>> s;
// 放空的哈希表进去
s.push({});
int i = 0, len = formula.length();
while(i < len) {
char c = formula[i];
if(c == '(') {
i ++;
// 放空的哈希表进去
s.push({});
} else if(c == ')') {
i ++;
// 获取后面的数字
int num = getNum(formula, i);
// 出栈合并到之前的统计中
auto atoms = s.top();
s.pop();
for(auto& [atom, n] : atoms) {
s.top()[atom] += n * num;
}
} else {
// 一步步统计原子的数量
string atom = getAtom(formula, i);
int num = getNum(formula, i);
s.top()[atom] += num;
}
}
auto& atoms = s.top();
// 把统计结果从哈希表中转移到vector中方便排序
vector<pair<string, int>> count;
for(auto& [atom, n] : atoms) {
count.push_back({atom, n});
}
sort(count.begin(), count.end());
string res;
for(auto& [atom, n] : count) {
res += atom;
if(n > 1) {
res += to_string(n);
}
}
return res;
}
// 扫描完整化学元素名称
string getAtom(string formula, int& i) {
string atom;
atom += formula[i ++];
// 判断后面是否是小写字母
while(i < formula.length() && islower(formula[i])) {
atom += formula[i ++];
}
return atom;
}
int getNum(string formula, int& i) {
int n = formula.length();
// 没有数字统一视为1
if(i == n || !isdigit(formula[i])) {
return 1;
}
int num = 0;
// 获取完整数字的值
while(i < n && isdigit(formula[i])) {
num = num * 10 + int(formula[i ++] - '0');
}
return num;
}
};
以上是关于LeetCode 726 原子的数量[Map 栈] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript 刷题] 栈 - 原子的数量, leetcode 726
[JavaScript 刷题] 栈 - 原子的数量, leetcode 726
[Hdfs] lc726. 原子的数量(模拟+dfs+栈+字符串处理+好题)
LeetCode 451. 根据字符出现频率排序 / 645. 错误的集合 / 726. 原子的数量 / NC52 括号序列 / NC102 最近公共祖先 / NC78 反转链表