LeetCode-726 原子的数量 递归

LeetCode-726 原子的数量 递归

题目链接:LeetCode-726 原子的数量

给你一个字符串化学式 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}。

示例 4:
输入:formula = “Be32”
输出:“Be32”

提示:

  • 1 <= formula.length <= 1000
  • formula 由英文字母、数字、’(’ 和 ‘)’ 组成
  • formula 总是有效的化学式
  • 输出的所有值总是在 32-bit 整数范围内

本题并没有特别复杂、特别难理解的思路,但是对于各种情况需要妥善地加以处理,再配合递归的思想和 map 即可解出。

首先我们来分析以下,我们在遍历给定的字符串的时候会遇到以下几种情况:

  1. 常规情况

    这里的情况指的是常规的字符和数字,即没有括号的情况。在这种情况下,我们知道,大写字母及其后跟着的小写字母表示的是化学元素的名称;而元素名称后面又有两种情况,一是后面直接跟其他大写字母,这种情况下即元素个数缺省,默认为1,另一种情况是后面跟着数字,则数字表示该元素的原子个数。

  2. 括号

    括号及嵌套括号的出现是这个题要仔细处理的一个情况。对于这种多层括号嵌套,最里面的括号中就是我们上面的常规情况,而不同级的括号嵌套这种情况非常适合我们用递归的方式进行处理。

在具体实现中,我们将遍历字符串中遇到的字符分为以下三种情况:

  1. 遇到 (

    当遇到左括号时,我们要开始准备递归,在这种情况下,对当前括号里的子串进行递归调用,并用一个子 map 来接收当前括号内子串的原子名称及个数。当我们遇到有括号会退出递归函数,注意当退出递归函数时我们需要记录其后面的一个数字,并将它乘到我们的子串得到的子 map 所统计的原子个数上。

  2. 遇到 )

    遇到右括号时,我们肯定在之前遇到过一个左括号并进入递归函数,这时我们只需返回,并让遍历索引往后走一步即可。

  3. 其他情况

    其他情况即上述常规情况,我们遇到的是代表原子名称的字母和代表原子个数的数字。我们会分别实现两个函数来获取原子名称和个数。

其他需要注意的点:

  • 题目中要求的字典序,map 会自动帮我们排序。
  • 整个过程中维护的遍历索引 i 需要再函数间传递时使用引用传递。

完整代码:

class Solution {
private:int get_num(string& s, int& i) {string num = "";while (isdigit(s[i])) {num += s[i++];}return num.empty() ? 1 : stoi(num);}string get_name(string& s, int& i) {string name = "";while (isalpha(s[i]) && (name.empty() || islower(s[i]))) {name += s[i++];}return name;}map<string, int> get_map(string& s, int& i) {map<string, int> ans;while (i != s.length()) {if (s[i] == '(') {map<string, int> temp = get_map(s, ++i);int cnt = get_num(s, i);for (auto& kv : temp) {ans[kv.first] += kv.second * cnt;}}else if (s[i] == ')') {++i;return ans;}else {string name = get_name(s, i);int cnt = get_num(s, i);ans[name] += cnt;}}return ans;}public:string countOfAtoms(string formula) {int i = 0;string ans;for (auto& kv : get_map(formula, i)) {ans += kv.first;if (kv.second > 1) {ans += to_string(kv.second);}}return ans;}
};

Ref:

https://leetcode-cn.com/problems/number-of-atoms/

https://riba2534.blog.csdn.net/article/details/88591566

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java安全(四) JNDI

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 1.JNDI JNDI(Java Naming and Directory Interface)是Java提供的Java 命名和目录接口。通过调用JNDI的API应用程序可以定位资源和其他程序对象。JNDI是Java…

二叉树的层序遍历和前中后序遍历代码 迭代/递归

前中后序遍历&#xff08;DFS&#xff09; 首先我们要明确前中后序遍历的顺序&#xff1a; 前序&#xff1a;中左右中序&#xff1a;左中右后序&#xff1a;左右中 前中后序遍历的递归代码和迭代代码分别有各自的框架&#xff0c;然后根据遍历顺序调整记录元素的位置即可。 …

java安全(五)java反序列化

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 1. 序列化 在调用RMI时,发现接收发送数据都是反序列化数据. 例如JSON和XML等语言,在网络上传递信息,都会用到一些格式化数据,大多数处理方法中&#xff0c…

git merge和rebase的区别与选择

git merge和rebase的区别与选择 转自&#xff1a;https://github.com/geeeeeeeeek/git-recipes/wiki/5.1-%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6%EF%BC%9AMerge%E3%80%81Rebase-%E7%9A%84%E9%80%89%E6%8B%A9#merge BY 童仲毅&#xff08;geeeeeeeeekgithub&#xff09; 这是一篇…

java安全(六)java反序列化2,ysoserial调试

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; ysoserial 下载地址&#xff1a;https://github.com/angelwhu/ysoserial ysoserial可以让⽤户根据⾃⼰选择的利⽤链&#xff0c;⽣成反序列化利⽤数据&…

C++面试常见问题一

C面试常见问题一 转自&#xff1a;https://oldpan.me/archives/c-interview-answer-1 原作者&#xff1a;[oldpan][https://oldpan.me/] 前言 这里收集市面上所有的关于算法和开发岗最容易遇到的关于C方面的问题&#xff0c;问题信息来自互联网以及牛客网的C面试题目汇总。答题…

java安全(七) 反序列化3 CC利用链 TransformedMap版

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 目录图解代码demo涉及的接口与类&#xff1a;TransformedMapTransformerConstantTransformerInvokerTransformerChainedTransformerdome理解总结&#xff1a…

C++编译时多态和运行时多态

C编译时多态和运行时多态 作者&#xff1a;melonstreet 出处&#xff1a;https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0…

java安全(八)TransformedMap构造POC

给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 给个关注&#xff1f;宝儿&#xff01; 上一篇构造了一个了commons-collections的demo 【传送门】 package test.org.vulhub.Ser;import org.apache.commons.collections.Transformer; import org…

Pytorch Tutorial 使用torch.autograd进行自动微分

Pytorch Tutorial 使用torch.autograd进行自动微分 本文翻译自 PyTorch 官网教程。 原文&#xff1a;https://pytorch.org/tutorials/beginner/basics/autogradqs_tutorial.html#optional-reading-tensor-gradients-and-jacobian-products 在训练神经网络时&#xff0c;最常使用…

TVM:编译深度学习模型快速上手教程

TVM&#xff1a;编译深度学习模型快速上手教程 本文将展示如何使用 Relay python 前端构建一个神经网络&#xff0c;并使用 TVM 为 Nvidia GPU 生成一个运行时库。 注意我们需要再构建 TVM 时启用了 cuda 和 llvm。 TVM支持的硬件后端总览 在本教程中&#xff0c;我们使用 cu…

TVM:设计与架构

TVM&#xff1a;设计与架构 本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员。页面组织如下&#xff1a; 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤。要开始使用&#xff0c;请先阅读本节。 逻辑架构组件部分描述了逻辑组件。后面的部…

递归+回溯

递归-回溯 本文参考自代码随想录视频&#xff1a; https://www.bilibili.com/video/BV1cy4y167mM https://www.bilibili.com/video/BV1ti4y1L7cv 递归回溯理论基础 只要有递归&#xff0c;就会有回溯&#xff0c;递归函数的下面的部分通常就是回溯的逻辑。 回溯是纯暴力的搜索…

Nvidia CUDA初级教程1 CPU体系架构综述

Nvidia CUDA初级教程1 CPU体系架构综述 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p2 讲师&#xff1a;周斌 本节内容&#xff1a;了解现代CPU的架构和性能优化&#xff1a; 流水线 Pipelining分支预测 Branch Prediction超标量 Superscalar乱序执行 Out…

Nvidia CUDA初级教程2 并行程序设计概述

Nvidia CUDA初级教程2 并行程序设计概述 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p3 讲师&#xff1a;周斌 本节内容&#xff1a; 为什么需要&#xff1f;怎么做&#xff1f;一些技术和概念 串并行计算模式 串行计算模式 常规软件时串行的 设计运行…

Nvidia CUDA初级教程4 GPU体系架构概述

Nvidia CUDA初级教程4 GPU体系架构概述 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p5 讲师&#xff1a;周斌 本节内容&#xff1a; 为什么需要GPU三种方法提升GPU的处理速度实际GPU的设计举例&#xff1a; NVDIA GTX 480: FermiNVDIA GTX 680: Kepler GP…

Nvidia CUDA初级教程5 CUDA/GPU编程模型

Nvidia CUDA初级教程5 CUDA/GPU编程模型 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p6 讲师&#xff1a;周斌 本节内容&#xff1a; CPU和GPU互动模式GPU线程组织模型&#xff08;需要不停强化&#xff09;GPU存储模型基本的编程问题 CPU与GPU交互 各自…

Nvidia CUDA初级教程6 CUDA编程一

Nvidia CUDA初级教程6 CUDA编程一 视频&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p7 讲师&#xff1a;周斌 GPU架构概览 GPU特别使用于&#xff1a; 密集计算&#xff0c;高度可并行计算图形学 晶体管主要被用于&#xff1a; 执行计算而不是 缓存数据控制指令…

由前中后遍历序列构建二叉树

由前/中/后遍历序列构建二叉树 基础 首先&#xff0c;我们需要知道前中后序三种深度优先遍历二叉树的方式的具体顺序&#xff1a; 前序&#xff1a;中左右中序&#xff1a;左中右后序&#xff1a;左右中 另外&#xff0c;要知道只有中序前/后序可以唯一确定一棵二叉树&…

手写nms

手写nms 计算宽高的时候加1是为什么&#xff1f; 本文总结自互联网的多种nms实现&#xff0c;供参考&#xff0c;非博主原创&#xff0c;各原文链接如下&#xff0c;也建议大家动手写一写。 Ref&#xff1a; 浅谈NMS的多种实现 目标窗口检测算法-NMS非极大值抑制 一、fas…