题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
解法:栈
思路:
1、由于左括号和右括号是闭合的,所以要满足是有效的括号,其字符串长度应为偶数。如果为奇数,则表明必然有一个括号不匹配,可直接返回false。
2、利用栈先进后出的特点,遍历字符串:
1)如果遇到左括号,则直接入栈。
2)如果遇到右括号,则查看栈顶元素是否与当前右括号匹配
- 如果不匹配,直接返回false。
- 如果匹配,则继续循环。
3、循环结束。若栈为空,则表明是有效的括号,若栈不为空,则表明不是有效的括号。
代码:
class Solution {
public boolean isValid(String s) {
//字符串的长度为奇数,则不匹配
if (s.length() % 2 == 1){
return false;
}
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 != '('){
return false;
}
if (c == '}' && top != '{'){
return false;
}
if (c == ']' && top != '['){
return false;
}
}
}
return stack.isEmpty();
}
}版权声明:本文为weixin_47382783原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。