0726. 原子的数量
题目地址(726. 原子的数量)
https://leetcode-cn.com/problems/number-of-atoms/
题目描述
前置知识
栈
公司
暂无
思路
这道题我们可以利用从后往前遍历
+对次数入栈
的技巧,这样问题就和诸如394. 字符串解码 这种中等题目并无二致了。
具体来说,我们可以使用一个字典存储每一个原子的出现情况,字典的 key 为原子,value 为原子出现次数,最后对该字典进行排序处理输出即可。
那么字典如何生成呢?
我们可以从后往前遍历,这样遇到一个大写字母我们就将其作为一个分界线。记当前位置为 s1,其右侧第一个大写字母的左侧位置记为 s2,那么 s[s1]s[s1+1]...s[s2-1] 就是一个完整的原子。接下来,我们需要知道完整的原子的出现次数。
接下来需要本题的第二个技巧。那就是将数字入栈,而不是原子,(这是因为我们是从后往前遍历的)然后根据栈中存储的数字决定当前原子出现的次数。比如 K4(ON(SO3)2)2,我们从后往前面遍历,栈中开始是 [1] -> [1,2] -> [1,2,4] -> [1,2,4,12]。我们就知道 O 需要重复 12 次,接下来栈变为 [1,2,4] ,我们就知道 S 需要重复 4 次。接下来栈变为 [1,2],我们就知道 O 和 N 分别出现 2 次,继续栈变为 [1],不难得出 K 出现 4 次,累加即可得到字典。
关键点
从后往前遍历
代码
语言支持:Python3
Python3 Code:
复杂度分析
令 n 为 s 长度。
时间复杂度:由于使用到了排序,因此时间复杂度为 $O(nlogn)$
空间复杂度:由于使用到了哈希表和栈,并且栈的大小和哈希表的大小都不会超过 s 的长度,因此空间复杂度为 $O(n)$
此题解由 力扣刷题插件 自动生成。
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
最后更新于