我正在尝试解决这个问题:https://leetcode.com/articles/number-of-atoms/#approach-1-recursion-accepted https://leetcode.com/articles/number-of-atoms/#approach-1-recursion-accepted.
问题是:给定一个类似的公式C(Mg2(OH)4)2
,返回包含元素及其计数的哈希表。元素名称始终以大写字母开头,后面可能跟一个小写字母。
我想我首先要解决最简单的情况:没有括号。
def bracket_hash(formula):
element = ""
atom_count = 0
element_hash = {}
for x in formula:
if x.isupper():
if element!="":
element_hash[element] = 1
element = ""
element = x
elif x.islower():
element += x
else:
element_count = int(x)
element_hash[element] = element_count
element_count = 0
element = ""
if element!="":
element_hash[element] = 1
return element_hash
这段代码对于以下情况非常有效:
print(bracket_hash("H2O"))
print(bracket_hash("CO2"))
print(bracket_hash("Mg2O4"))
print(bracket_hash("OH"))
现在我认为必须使用堆栈来处理多个括号的情况,例如OH(Ag3(OH)2)4
,这里 Ag 的计数必须为 3*4,O 和 H 的计数将为 2*4 + 1。
到目前为止,我从这样的事情开始:
def formula_hash(formula):
stack = []
final_hash = {}
cur = ""
i = 0
while i < len(formula):
if formula[i] == '(':
j = i
while formula[j]!=')':
j = j + 1
cur = formula[i:j]
stack.append(bracket_hash(cur))
cur = ""
i = j + 1
但现在我被困住了。
当编码问题变得越来越长并且涉及到多种数据结构来解决时,我有点陷入困境。这里他们使用哈希表和堆栈。
所以我的问题是:如何将这个问题分解为可管理的部分并解决它。如果我真的要解决这个问题,我必须将其映射到可管理的代码段。任何帮助将不胜感激。
Thanks.
我认为你可以使用递归来解决这个问题。以下是您的函数应该如何工作:
- 就像您在第一个代码中所做的那样,直到遇到左括号。
- 当遇到左括号时,找到对应的右括号。这可以通过计数器来完成:将其初始化为 1,然后当遇到新的左括号时,递增计数器,当遇到右括号时递减计数器。当计数器等于 0 时,您就找到了匹配的右括号。
- 剪切括号之间的字符串并使用该字符串调用相同的函数(这是递归方面)。
- 将返回的字典中的值添加到当前字典中,并乘以括号后面的数字。
如果您在实施此解决方案的某些部分时遇到问题,请告诉我,我将提供更多详细信息。
编辑:关于堆栈方法堆栈方法只是模拟递归性。它没有再次调用该函数并拥有本地计数器,而是拥有一个计数器堆栈。当左括号打开时,它在此上下文中计数,当它关闭时,它将与包含它的上下文合并,并具有相应的多重性。
到目前为止我更喜欢递归方法,它更自然。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)