有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
**输入:**s = “()”
**输出:**true
示例 2:
**输入:**s = “()[]{}”
**输出:**true
示例 3:
**输入:**s = “(]”
**输出:**false
示例 4:
**输入:**s = “([])”
**输出:**true
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
题解
这是一道很经典的栈的问题,之前做过很多次,用过很多方法,笨拙的匹配也好,用 map 映射也好,总之我一直觉得是一道非常简单的问题;
但是当我第一次看见工程师外教的代码,我才意识到,即使同为程序员,写的代码之间的差距也是非常大的,他写的代码非常的优雅简洁
class Solution {String OPENINGS = "({[";String CLOSINGS = ")}]";public boolean isValid(String s) {Stack<Character> stack = new Stack<Character>();for(int i = 0; i < s.length(); i++){if(isOPENINGS(s.charAt(i))){stack.push(s.charAt(i));}else if(isCLOSINGS(s.charAt(i))){if(stack.empty() || !match(stack.pop(), s.charAt(i))){return false;}}}return stack.empty();}boolean isOPENINGS(Character o){return OPENINGS.indexOf(o) > -1;}boolean isCLOSINGS(Character o){return CLOSINGS.indexOf(o) > -1;}boolean match(Character a, Character b){return OPENINGS.indexOf(a) == CLOSINGS.indexOf(b);}
}
var OPENINGS string = "({["
var CLOSINGS string = ")}]"func isValid(s string) bool {stack := []byte{}for i := 0; i < len(s); i++ {if isOPENING(s[i]) {stack = append(stack, s[i])} else if isCLOSINGS(s[i]) {if len(stack) == 0 || !match(stack[len(stack)-1], s[i]) {return false}stack = stack[:len(stack)-1]}}return len(stack) == 0
}func isOPENING(o byte) bool {return strings.IndexByte(OPENINGS, o) > -1
}func isCLOSINGS(o byte) bool {return strings.IndexByte(CLOSINGS, o) > -1
}func match(a, b byte) bool {return strings.IndexByte(OPENINGS, a) == strings.IndexByte(CLOSINGS, b)
}