方法一:借助辅助栈——左括号入栈,右括号出栈
核心思想:
每次遇到’(’,’{’,’[‘这三种字符的时候,将字符入栈stk;而每次遇到’)’,’}’,’]‘这三种字符的时候则让对应的匹配字符出栈。具体规则如下:
1)引入辅助栈stk,遍历字符串,每次遇到’(’,’{’,’[‘字符的时候将字符入栈stk
2)当遇到’)’,’}’,’]'字符的时候,则检查栈是否空,且顶元素是否为匹配元素(如{和}匹配等),如果栈空或者栈顶元素不为匹配元素则括号序列不合法
3)当栈非空,且栈顶元素为匹配元素,则栈顶元素出栈。
4)循环匹配字符串,直到每次字符处理完
5)检查栈stk是否为空,栈为空则序列合法,否则不合法(当括号以正确顺序关闭时则最后的栈为空)
/**
*
* @param s string字符串
* @return bool布尔型
*/
function isValid( s ) {
// write code here
let arr = [];
for(let i=0;i<s.length;i++){
switch(s[i]){
case '(':
case '[':
case '{':
arr.push(s[i]); //当前字符为'(','{','['时,元素入栈
break;
case ')':
if(arr.length===0 || arr[arr.length-1] !== '(')
return false;
arr.pop();
break;
case ']':
if(arr.length===0 || arr[arr.length-1] !== '[')
return false;
arr.pop();
break;
case '}':
if(arr.length===0 || arr[arr.length-1] !== '{')
return false;
arr.pop();
break;
}
}
return arr.length===0 ? true : false;
}
module.exports = {
isValid : isValid
};
方法二:借助辅助栈——右括号入栈(推荐)
核心思想:
1 借助辅助栈,当遇到’(’,’[’,’{‘这三种字符的时候则让对应的匹配字符入栈(分别对应’)’,’]’,’}’),
2. 当出现的字符不是’(’,’[’,’{'这三种字符时,则先判断栈是否为空或者当前字符是否与栈顶元素一样,当栈空或者当前字符与栈顶字符不一样时,则括号序列不合法,直接返回;否则栈顶元素出栈。
3. 遍历字符串直到所有元素遍历完成。最后判断栈是否为空,不为空则括号序列不合法;否则为合法序列。
/**
*
* @param s string字符串
* @return bool布尔型
*/
function isValid( s ) {
// write code here
let stk = [];
for(let i=0;i<s.length;i++){
if(s[i] == '(') //当为(字符时,将匹配字符入栈,下同
stk.push(')');
else if(s[i] == '[')
stk.push(']');
else if(s[i] == '{')
stk.push('}');
else{ //当字符不是'(','[','{'这三种字符时,则判断当前字符是否与栈顶元素一样(栈非空时)
if(stk.length===0 || s[i] != stk[stk.length-1])
return false;
stk.pop();
}
}
return stk.length===0 ? true : false;
}
module.exports = {
isValid : isValid
};