有效的括号
有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 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)
}