返回
LeetCode 20. 有效的括号:解码字符串的奥妙
前端
2023-12-18 11:38:22
问题定义
给定一个由小括号('(',')')、中括号('{}')和大括号('[]')组成的字符串,判断该字符串是否有效。有效括号字符串的定义如下:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
例如,以下字符串都是有效的:
"()"
"{}"
"[]"
"(){}"
"([])"
以下字符串都是无效的:
"(]"
"([)]"
"{[]}"
解决方案
栈
栈是一种先进先出的数据结构,非常适合解决括号匹配问题。我们可以使用栈来存储左括号,当遇到右括号时,我们可以从栈中取出最后一个左括号并与之匹配。如果所有括号都能匹配,则该字符串是有效的;否则,该字符串是无效的。
def is_valid(s):
stack = []
for char in s:
if char in "([{":
stack.append(char)
else:
if not stack:
return False
top = stack.pop()
if (top == "(" and char != ")") or (top == "{" and char != "}") or (top == "[" and char != "]"):
return False
return not stack
递归
递归是一种函数调用自身的方法,非常适合解决具有嵌套结构的问题。我们可以使用递归来逐层匹配括号,直到所有括号都匹配或遇到无效匹配为止。
def is_valid(s):
def helper(i, j):
if i > j:
return True
if s[i] not in "([{":
return False
match = {")": "(", "}": "{", "]": "["}
if s[j] != match[s[i]]:
return False
return helper(i + 1, j - 1)
return helper(0, len(s) - 1)
字符串处理
字符串处理是一种更直接的方法,不需要使用栈或递归。我们可以使用字符串的操作来判断括号是否匹配。例如,我们可以使用以下正则表达式来判断字符串是否有效:
import re
def is_valid(s):
return re.match("^[()]*import re
def is_valid(s):
return re.match("^[()]*$", s) or re.match("^{}$", s) or re.match("^\[\]*$", s)
quot;, s) or re.match("^{}import re
def is_valid(s):
return re.match("^[()]*$", s) or re.match("^{}$", s) or re.match("^\[\]*$", s)
quot;, s) or re.match("^\[\]*import re
def is_valid(s):
return re.match("^[()]*$", s) or re.match("^{}$", s) or re.match("^\[\]*$", s)
quot;, s)
总结
在本文中,我们讨论了 LeetCode 20 的有效括号问题,并介绍了使用栈、递归和字符串处理技术来解决该问题的各种方法。这些方法各有优缺点,您可以根据自己的喜好选择使用哪种方法。无论您选择哪种方法,重要的是要理解该问题的基本原理,并能够将这些原理应用于其他类似的问题。