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.pswp.cn/news/532547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532547.shtml
英文地址,請注明出處:http://en.pswp.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…