目录
一、问题描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
二、解题思路
判断括号字符串是否有效的关键在于检查括号的配对顺序。通常通过使用 栈 这一数据结构来解决,因为栈具有后进先出的特性,非常适合处理成对出现的括号。
具体步骤:
-
定义一个栈:用于存储遇到的左括号。每当遇到左括号时,推入栈中;每当遇到右括号时,检查栈顶元素是否与当前右括号匹配。
-
匹配规则:
- 当遇到左括号
(
,{
,[
时,将其压入栈中。 - 当遇到右括号
)
,}
,]
时:- 如果栈为空,说明没有与之对应的左括号,字符串无效;
- 如果栈不为空,则检查栈顶元素是否为对应的左括号,如果匹配则弹出栈顶元素,继续检查后续字符;
- 如果不匹配,则字符串无效。
- 当遇到左括号
-
最后检查:遍历完成后,如果栈为空,则字符串有效;如果栈不为空,说明有未匹配的左括号,字符串无效。
边界条件:
- 空字符串默认是有效的;
- 字符串长度为奇数时,一定无效。
三、代码
class Solution {
public boolean isValid(String s) {
// 定义一个栈来保存左括号
Stack<Character> stack = new Stack<>();
// 遍历字符串中的每个字符
for (char c : s.toCharArray()) {
// 如果遇到左括号,推入栈中
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}
// 如果遇到右括号,检查栈顶元素是否匹配
else {
// 如果栈为空,说明没有对应的左括号,返回 false
if (stack.isEmpty()) {
return false;
}
// 弹出栈顶元素,并检查是否匹配
char top = stack.pop();
if (c == ')' && top != '(' || c == '}' && top != '{' || c == ']' && top != '[') {
return false;
}
}
}
// 最后检查栈是否为空,如果为空则表示完全匹配
return stack.isEmpty();
}
}
四、复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串的长度。我们只遍历字符串一次,且每个字符操作(入栈或出栈)都是常数时间。 - 空间复杂度:
O(n)
,在最坏的情况下,栈中存储所有的左括号,因此空间复杂度为O(n)
。