20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for item in s:
if item in ['(', '[', '{']:
stack.append(item)
elif item in [')', ']', '}']:
if not stack:
return False
if (stack[-1] == '(' and item == ')') or (stack[-1] == '[' and item == ']') or (stack[-1] == '{' and item == '}'):
stack.pop()
else:
return False
return True if not stack else False
该代码的目的是检查一个给定的字符串s
是否是有效的括号字符串。为了完成这个任务,代码使用了一个栈数据结构。
首先,代码初始化了一个空的栈。接着,它遍历输入字符串s
中的每个字符。对于每个字符,代码首先检查它是否是左括号('(', '[', '{')。如果是左括号,代码将其压入栈中。
接下来,如果字符是右括号(')', ']', '}'),代码会进行一些检查。首先,它检查栈是否为空。如果栈为空,这意味着遇到了一个不匹配的右括号,因此输入字符串不是有效的括号字符串,代码直接返回False
。
如果栈不为空,代码接着检查栈的顶部元素是否与当前字符匹配。例如,如果栈顶元素是'('且当前字符是')',那么这是一个匹配的括号对。在这种情况下,代码从栈中弹出该元素。
循环结束后,代码检查栈是否为空。如果栈为空,这意味着所有的左括号都有与之匹配的右括号,因此输入字符串是有效的括号字符串,代码返回True
。否则,返回False
表示存在未匹配的左括号。
总的来说,该代码通过遍历输入字符串并使用栈来跟踪匹配的左括号,从而有效地检查了括号的匹配性。
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
- 输入:"abbaca"
- 输出:"ca"
- 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
# 方法一,使用栈
class Solution:
def removeDuplicates(self, s: str) -> str:
# 创建一个空列表 res,用作栈
res = list()
# 遍历输入的字符串 s 中的每个字符
for item in s:
# 检查栈 res 是否非空且当前字符与栈顶字符相同
if res and res[-1] == item:
# 如果相同,从栈中移除栈顶字符
res.pop()
else:
# 如果不相同,将当前字符推入栈中
res.append(item)
# 将栈中的字符连接起来形成结果字符串
return "".join(res) # 字符串拼接
-
class Solution:
:这是一个命名类的开始,通常用于包装解决特定问题的方法。 -
def removeDuplicates(self, s: str) -> str:
:这是一个类方法removeDuplicates
,它接受一个字符串参数s
并返回一个字符串。self
是 Python 中表示对象自身的约定参数。 -
res = list()
:在方法内部,创建一个名为res
的空列表,它将充当栈的角色。 -
for item in s:
:这是一个for
循环,用于迭代输入字符串s
中的每个字符。在每次迭代中,当前字符被赋值给变量item
。 -
if res and res[-1] == item:
:这是一个条件语句,它检查栈res
是否非空(res
)且当前字符是否与栈顶字符相同(res[-1]
)。如果两者都成立,表示找到了相邻的重复字符。 -
res.pop()
:如果条件满足,执行这行代码,从栈中移除栈顶的字符。 -
else:
:如果条件不满足,执行这个分支。 -
res.append(item)
:在这个分支中,将当前字符item
推入栈res
,因为它不与栈顶字符相同。 -
return "".join(res)
:在循环结束后,使用"".join(res)
将栈中的字符连接起来,形成一个字符串。这个字符串是去除相邻重复字符后的结果。
整体上,这段代码使用栈数据结构来检测并移除输入字符串中的相邻重复字符,最后返回去重后的字符串。
150. 逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
from operator import add, sub, mul # 导入加法、减法和乘法运算符
class Solution:
# 定义一个字典,将运算符映射到相应的操作函数
op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}
def evalRPN(self, tokens: List[str]) -> int:
stack = [] # 创建一个空栈,用于计算逆波兰表达式
# 遍历输入的逆波兰表达式
for token in tokens:
if token not in {'+', '-', '*', '/'}: # 如果是操作数
stack.append(int(token)) # 将操作数转换为整数并推入栈中
else: # 如果是运算符
op2 = stack.pop() # 弹出栈顶的第二个操作数
op1 = stack.pop() # 弹出栈顶的第一个操作数
# 根据运算符在 op_map 中查找相应的操作函数,并将结果推入栈中
stack.append(self.op_map[token](op1, op2)) # 第一个出来的在运算符后面
return stack.pop() # 返回栈中剩余的结果(最终的计算结果)