以下是关于 LeetCode 上 “有效的括号” 这道简单算法题的分析与解答:
题目描述
给定一个只包含括号字符 (
、)
、{
、}
、[
、]
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
例如,字符串 "()"
、"()[]{}"
是有效的,而 "(]"
、"([)]"
是无效的。
解题思路
可以使用栈(Stack)这种数据结构来解决此问题。
- 遍历输入的字符串
s
。 - 当遇到左括号时,将其压入栈中。
- 当遇到右括号时,检查栈顶元素:
- 如果栈为空,说明没有与之匹配的左括号,直接返回
false
。 - 如果栈顶元素是与之对应的左括号类型,则将栈顶元素弹出,表示匹配成功。
- 如果栈顶元素不是与之对应的左括号类型,返回
false
。
- 遍历完整个字符串后,如果栈为空,说明所有的括号都匹配成功,返回
true
;否则,返回false
。
示例代码(以 Python 为例)
def isValid(s): stack = [] brackets_dict = {')': '(', '}': '{', ']': '['} for char in s: if char in "([{": stack.append(char) elif char in ")]}": if not stack: return False if stack[-1] == brackets_dict[char]: stack.pop() else: return False return not stack
在上述代码中:
- 首先创建了一个空栈
stack
和一个字典brackets_dict
,用于存储右括号与左括号的对应关系。 - 然后遍历字符串
s
,根据字符是左括号还是右括号进行相应的操作。 - 最后根据栈是否为空来判断字符串中的括号是否有效。
其他编程语言如 Java、C++ 等也可以按照类似的思路实现,只是语法上会有所不同。例如 Java 实现如下:
import java.util.Stack; public class ValidBrackets { public static boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for (char c : s.toCharArray()) { if (c == '(' || c == '[' || c == '{') { stack.push(c); } else { if (stack.isEmpty()) { return false; } char top = stack.pop(); if ((c == ')' && top!= '(') || (c == ']' && top!= '[') || (c == '}' && top!= '{')) { return false; } } } return stack.isEmpty(); } }
在 Java 代码中,利用了 Java 内置的 Stack
类来实现栈的功能,同样按照上述的思路对输入字符串进行处理以判断括号的有效性。