返回
Leetcode刷题——有效的括号深度解析
前端
2023-09-20 11:54:01
题目背景
在Leetcode上,有一个广为人知的题目——“有效的括号”。该题目的目的是判断一个只包含括号的字符串是否有效。其中,有效字符串需要满足两个条件:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
解决思路
为了解决这个问题,我们可以使用栈的数据结构。栈是一种遵循后进先出(LIFO)原则的线性数据结构,这意味着最后一个进入栈中的元素将第一个被移出。
我们可以将左括号压入栈中,然后当遇到右括号时,我们将栈顶的元素弹出并检查它是否与当前右括号匹配。如果匹配,则继续处理下一个字符;如果不匹配,则字符串无效。
具体实现
以下是以Python语言实现的具体代码示例:
def is_valid(s):
"""
判断一个只包含括号的字符串是否有效。
Args:
s (str): 输入字符串
Returns:
bool: 字符串是否有效
"""
# 创建一个栈
stack = []
# 遍历字符串中的每个字符
for char in s:
# 如果是左括号,则将其压入栈中
if char in "([{":
stack.append(char)
# 如果是右括号,则检查栈顶元素是否与之匹配
elif char in ")]}":
# 如果栈为空,则字符串无效
if not stack:
return False
# 如果栈顶元素与当前右括号不匹配,则字符串无效
if (char == ')' and stack[-1] != '(') or \
(char == ']' and stack[-1] != '[') or \
(char == '}' and stack[-1] != '{'):
return False
# 弹出栈顶元素
stack.pop()
# 如果栈为空,则字符串有效
return not stack
代码示例
以下是一些代码示例:
# 示例1
s = "()[]{}"
print(is_valid(s)) # True
# 示例2
s = "([{}])"
print(is_valid(s)) # True
# 示例3
s = "((){[]})"
print(is_valid(s)) # True
# 示例4
s = "())"
print(is_valid(s)) # False
# 示例5
s = "([)]"
print(is_valid(s)) # False
时间复杂度和空间复杂度
该算法的时间复杂度为O(n),其中n是字符串的长度。这是因为算法需要遍历字符串中的每个字符。空间复杂度为O(n),这是因为算法需要使用栈来存储左括号。
总结
Leetcode上的“有效的括号”题目是一个经典的算法题,它考察了算法工程师对栈数据结构的理解和应用能力。通过本文的详细解析,希望你能对该题目的解决思路和具体实现有更深刻的理解。