力扣Hot100题目解析:栈与字符串处理 —— 有效的括号
题目描述
给定一个只包括 '(', ')', '{', '}', '[' 和 ']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例:
输入:s = "()[]{}" 输出:true
输入:s = "(]" 输出:false
解题思路讲解(栈 + 字符串处理)
这道题目考察的是括号的匹配问题,典型的用栈解决。让我们一步一步来看思路:
步骤分解
- 遇到左括号就入栈:遍历字符串,如果当前字符是左括号('(', '[', '{'),就把它压入栈中。
- 遇到右括号就检查匹配:如果遇到右括号(')', ']', '}'),需要检查当前栈顶元素是否为对应的左括号。
- 如果匹配,则弹出栈顶元素,继续遍历。
- 如果不匹配(栈空或类型不对),说明不是有效括号,直接返回false。
- 遍历结束后检查栈是否为空:若栈为空,说明所有括号都匹配,返回true;否则返回false。
为什么用栈?
栈是一种"先进后出"的数据结构,适合处理这种成对出现、嵌套结构的问题。
Java代码实现
import java.util.Stack;
public class Solution {
/**
* 判断字符串括号是否有效
* @param s 输入字符串
* @return 是否有效
*/
public 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();
}
}
代码注释说明
- 用
Stack<Character>
存储左括号。 - 每遇到右括号都和栈顶左括号进行匹配。
- 最后栈必须为空,才能返回true。
希望通过本题解析,你能掌握用栈处理括号匹配等类似结构化字符串问题的方法!
文章标签:力扣,算法,Java,栈,字符串处理,面试