题目描述
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
提示:
1 <= S.length <= 20000
S 仅由小写英文字母组成。
解题思路
- 初始化一个空栈 num_stack 用来存储操作数。
- 遍历输入列表 tokens 中的每一个元素 token:
1)如果 token 是一个数字,将其转换为整数并压入栈中。
2)如果 token 是一个操作符(即 ‘+’, ‘-’, ‘*’, ‘/’):
1> 从栈中弹出两个操作数(第二个弹出的操作数作为第一个操作数的右侧操作数)
2> 根据操作符执行相应的计算。
3> 将计算结果压入栈中。 - 遍历完成后,栈中剩余的元素即为最终的结果。
代码实现
def eval_value(operator, value1, value2):
match operator:
case '+':
return value1 + value2
case '-':
return value1 - value2
case '*':
return value1 * value2
case '/':
return int(value1 / value2) if value1 * value2 > 0 else -int(abs(value1) / abs(value2))
def parse_tokens(tokens):
stack = []
operator = ['+', '-', '*', '/']
for token in tokens:
if token not in operator:
stack.append(int(token))
else:
op2 = stack.pop()
op1 = stack.pop()
stack.append(eval_value(token, op1, op2))
return stack.pop()
print(parse_tokens(["2", "1", "+", "3", "*"]))
注意:match是Python3.10版本之后才加入的语法