力扣刷题:有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
Related Topics
栈
字符串
👍 2917
👎 0
解题思路:
遍历字符传
-
情况1:如果遍历的当前字符是右括号,则入栈
-
情况2:如果遍历的当前字符是左括号,先判断当前栈是否为空,如果当前栈为空,则说明第一个入栈的字符就是左括号,肯定是不是有效的字符串(例如")"不是有效的字符串)。然后在栈中寻找对应的右括号并将此出栈。注意:要匹配的左括号应该与当前栈顶的元素相匹配。如果不匹配,则不是有效的字符串,返回false。如果匹配,则结束当前循环,进入下一次循环(已经匹配并且出栈)
最后判断栈中的长度是否为0,如果为0,则说明全部匹配成功,是有效的字符串。
import java.util.Stack;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public boolean isValid(String s) {
if(s.length()%2!=0) return false;
Stack<Character> A = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
//右括号入栈
if(selectStack(s.charAt(i))==1) A.push(s.charAt(i));
//判断进入的左括号是否和栈顶的右括号匹配
else if(A.empty()||A.pop()!=getReverse(s.charAt(i))){
return false;//不匹配就已经表明不是有效的字符串
}else{
//这里说明匹配成功,被匹配到的右括号已经出栈
continue;
}
}
return A.size()==0?true:false;
}
public int selectStack(char a){
//1便是右括号,0表示左括号
return a=='{'||a=='['||a=='(' ? 1:0;
}
public char getReverse(char a){
switch (a){
case '{':
return '}';
case '[':
return ']';
case '(':
return ')';
case '}':
return '{';
case ']':
return '[';
case ')':
return '(';
default:
return '0';
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
时间复杂度O(n),空间复杂度O(n)