题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
解题思路
本题满足完全包含关系,也就是说我们可以使用栈来解题,遍历字符串,当遇到左括号(、[、{
时,将其入栈,当遇到右括号时,判断栈顶元素是否是对应的左括号,如果是则弹栈,最后判断栈是否为空即可。
代码
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();//实例化栈
char[] c = s.toCharArray();//将字符串转为字符数组
for(int i = 0; i<c.length;i++){//遍历括号字符数组
switch (c[i]){
case '(':
case '[':
case '{':stack.push(c[i]);break; //左括号入栈
case ')':if(stack.empty() || stack.peek() != c[i]-1) return false; stack.pop(); break; //如果是")",如果此时栈为空或者栈顶元素不是"("直接返回false,否则弹栈。
case ']':
case '}':if(stack.empty() || stack.peek() != c[i]-2) return false; stack.pop(); break;//大致同上
}
}
return stack.empty();
}
总结
- 小括号ASCII码相差1:
'(' + 1 = ')'
- 中、大括号ASCII码相差2:
'[' / '{' + 2 = ']' / '}'