LeetCode 726 原子的数量[Map 栈] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 726 原子的数量[Map 栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述在这里插入图片描述
解题思路:
凡是与括号有关的就能联想到递归,用到递归就可以想到栈,本题使用哈希表栈的方式实现,总体来说思路还是很清晰的,如果不用哈希表栈可能需要两个栈去实现,就变得复杂了,思路如下:

  1. 编写获取元素的函数和获取数字的函数;
  2. 构建哈希表栈,首先将空的哈希表放进去;
  3. 遍历化学表达式,如果遇到“(”就放空的哈希表进去,如果是“)”就把当前的哈希表取出并更新到栈顶,否则一步步统计元素的数量;
  4. 遍历完成后取出栈顶(这个时候所有元素都统计完成),放入vector中进行排序;
  5. 排序结果放入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 反转链表

leetcode726. Number of Atoms

LeetCode 895 最大频率栈[Map] HERODING的LeetCode之路