题解 | #有效括号序列#
有效括号序列
http://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2
描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
思路:
- 建立一个对象里面存放符号
- 之后对字符串进行遍历
- 如果栈的长度为0,则直接将其压入栈中
- 如果栈长不为0,则判定其与栈尾的符号是否匹配,匹配则将两个都删除,不匹配则压入
- 最后判断栈的长度是否为0
function isValid(s) {
let b = []
const obj = {
'[': ']',
'(': ')',
'{': '}'
}
let arr = s.split('')
console.log(arr);
for (let i = 0; i < arr.length; i++) {
if (b.length == 0) {
b.push(arr[i])
} else {
const a = b.pop()
if (arr[i] == obj[a]) {
continue
} else {
b.push(a)
b.push(arr[i])
}
}
}
if (b.length == 0) {
return true
} else {
return false
}
}
module.exports = {
isValid : isValid
};
第二种方法
思路:
- 使用一个栈来存放符号,如果为( { [ 的其中一个则压入栈中
- 如果不是的话首先判断栈的长度是否为0(如果为0则会出现这个情况 【‘ } ’】 )
- 如果栈长不为0,取出栈尾的元素,与其进行判断 是否匹配
function isValid( s ) {
const stack = [];
for(let i = 0; i < s.length; i++){
let item = s.charAt(i);
if(item === '(' || item === '{' || item === '['){
stack.push(item)
}else{
if(stack.length === 0) return false
else{
let o = stack.pop();
if(item === ')' && o !== '(') return false
if(item === '}' && o !== '{') return false
if(item === ']' && o !== '[') return false
}
}
}
return stack.length === 0 ? true:false
}
module.exports = {
isValid : isValid
};