给定一个化学式formula(作为字符串),返回每种原子的数量。

原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字。

如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。例如,H2O 和 H2O2 是可行的,但 H1O2 这个表达是不可行的。

两个化学式连在一起是新的化学式。例如 H2O2He3Mg4 也是化学式。

一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。

给定一个化学式,输出所有原子的数量。格式为:第一个(按字典序)原子的名子,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。

示例 1:

输入:
formula = "H2O"
输出: "H2O"
解释:
原子的数量是 {'H': 2, 'O': 1}。

示例 2:

输入:
formula = "Mg(OH)2"
输出: "H2MgO2"
解释:
原子的数量是 {'H': 2, 'Mg': 1, 'O': 2}。

示例 3:

输入:
formula = "K4(ON(SO3)2)2"
输出: "K4N2O14S4"
解释:
原子的数量是 {'K': 4, 'N': 2, 'O': 14, 'S': 4}。

类似于之前的“字符串解码”。需要注意的是类似A2BA这样子的化学式。我写的代码如下:

class Solution {
public:string countOfAtoms(string formula) {stack<map<string, int>> s;map<string, int> curSet;for (int i = 0; i < formula.size(); ) {if (isupper(formula[i])) {int j = i + 1;string tmp, tmp1;tmp += formula[i];if (j < formula.size() && islower(formula[j])) {tmp += formula[j++];}if (j < formula.size() && isdigit(formula[j])) {while (j < formula.size() && isdigit(formula[j])) {tmp1 += formula[j];j++;}}else {tmp1 = "1";}curSet[tmp] += stoi(tmp1);i = j;}else if (formula[i] == '(') {s.push(curSet);curSet.clear();i++;}else if (formula[i] == ')') {int j = i + 1;string tmp;while (j < formula.size() && isdigit(formula[j])) {tmp += formula[j];j++;}int cnt = stoi(tmp);map<string, int>& top = s.top();for (auto i = curSet.begin(); i != curSet.end(); i++) {top[i->first] += (i->second) * cnt;}curSet = top;s.pop();i = j;}}string res;for (auto i = curSet.begin(); i != curSet.end(); i++) {res += i->first + (i->second != 1? (to_string(i->second)): "");}return res;}
};

转载于:https://www.cnblogs.com/hlk09/p/9735103.html

LeetCode 726. 原子的数量相关推荐

  1. 726. 原子的数量

    给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表示原子的数量.如果数量 ...

  2. LeetCode-726. 原子的数量(python2)

    题目链接: 726.原子数量 题目难度:困难 题目描述: 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. ...

  3. LeetCode-726 原子的数量 递归

    LeetCode-726 原子的数量 递归 题目链接:LeetCode-726 原子的数量 给你一个字符串化学式 formula ,返回 每种原子的数量 . 原子总是以一个大写字母开始,接着跟随 0 ...

  4. 原子的数量(容易理解)

    题目描述 给定一个化学式formula(作为字符串),返回每种原子的数量. 原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数字表示原子的数量 ...

  5. LeetCode 452. 用最少数量的箭打破气球(贪心)

    1. 题目 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标. 由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了. 开始坐标总是小 ...

  6. LeetCode 447. 回旋镖的数量(哈希map+组合数)

    1. 题目 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到 ...

  7. LeetCode 1020. 飞地的数量(图的BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地). 移动是指在陆地上从一个地方走到另一个地方(朝四个方向 ...

  8. [LeetCode] 447.回旋镖的数量(Easy)C语言题解

    题目 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到所有回 ...

  9. leetcode 452. 用最少数量的箭引爆气球(贪心算法)

    在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总是小于结束坐标. 一 ...

最新文章

  1. ecshop支持mysql5.5吗,centos5.5 安装配置 ecshop【nginx + php + mysql】
  2. Intellij IDEA Debug调试技巧
  3. 怎么修改腾讯视频的昵称
  4. vim剪切指定行_10 分钟上手 Vim,常用命令大盘点
  5. 运算符--位移运算符和一些其他运算符
  6. MYSQL数据库中触发器禁用、启用、查询
  7. 字符编码方式及大端小端
  8. sql date时间加减几天几小时
  9. python通用编码_python2.7的编码的常见解决方案.md
  10. python必背入门代码-python必背内容有哪些
  11. 第五讲计算结果的可视化
  12. Chrome 87 发布,获多年来最大性能提升
  13. EndNoteX9插入参考文献
  14. python 实现微信自动回复(自动聊天)
  15. U-Net论文阅读(逐句翻译+精读)
  16. NPC 也有了生命?当 ChatGPT 注入游戏你能想象吗
  17. kafka安装及使用
  18. FH151C6 Apple Lighting数据线取电\放电芯片苹果OTG取电协议IC芯片
  19. CCF-CSP认证 历届第一题
  20. jvm G1 深度分析

热门文章

  1. spring框架文档学习(包会)
  2. php去掉内部空格_php中去掉头尾空格3种方法
  3. vant 下拉框样式_使用 Vue 的 Vant.js List 列表组件实现无限下拉
  4. 根目录访问php 404,nginx配置后只有根目录首页index.php能访问,其他页面404
  5. 计算机应用基础随堂,《计算机应用基础》随堂题库
  6. jquery选择器:与、或逻辑
  7. mysql 将查询所得结果集的某一字段拼接成字符串
  8. access导入链接快还是导入表快_Go 语言设计哲学之十三:理解包导入路径的含义...
  9. linux 显示文字在桌面背景,Linux下Xwindow的字体配置(所谓的字体美化)
  10. 2020年行政区划代码_2020年南宁市行政区划,了解南宁市有几个区,详细数据