20. 有效的括号

 

题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true

栈的典型应用,碰到左括号入栈,碰到右括号出栈进行匹配,全部匹配成功了就是有效的括号。

常规写法,使用switch-case匹配。

//C语言

bool isValid(char * s){
    char strStack[strlen(s) + 1];
    int i = 0, top = -1;
    while(s[i] != '\0'){
        switch(s[i]){
            case '(': strStack[++top] = '('; break;
            case '[': strStack[++top] = '['; break;
            case '{': strStack[++top] = '{'; break;
            case ')': 
            if(top != -1 && strStack[top] == '(') --top;
            else return false;
            break;
            case ']': 
            if(top != -1 && strStack[top] == '[') --top;
            else return false;
            break;
            case '}': 
            if(top != -1 && strStack[top] == '{') --top;
            else return false;
            break;
            default: break;
        }
        i++;
    }
    return top == -1;
}

//JS
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let stackArr = [];
    for(let i = 0; i < s.length; i++){
        if(s[i] == '(' || s[i] == '[' || s[i] == '{') stackArr.push(s[i]);
        else if(stackArr.length == 0) return false;
        else
            switch(s[i]){
                case ')': 
                if(stackArr.pop() != '(')  return false;
                else break;
                case ']': 
                if(stackArr.pop() != '[')  return false;
                else break;
                case '}': 
                if(stackArr.pop() != '{')  return false;
                else break;
            }
    }
    return stackArr.length == 0;
};

优化解法,借助ASCII,()的ASCII差1 []{}的ASCII差2,只要判断栈内和栈外的字符ASCII码差值即可。

//C

bool isValid(char * s){
    //空字符串显然符合
    if(*s == 0) return true;

    char stack[strlen(s)];
    int top = -1;

    for(int i=0; i<strlen(s); ++i){
        //如果是左括号们,欢迎入栈
        if(s[i] == '(' || s[i] == '[' || s[i] == '{')
            stack[++top] = s[i];
        //不是左括号们,如果栈空则无法配对,不符合
        else if(top == -1) return false;
        //不是左括号们,栈非空,当前和栈顶配对,符合
        else if(s[i] == stack[top]+1 || s[i] == stack[top]+2)
            stack[top--] = 0;
        //()的ASCII差1 []{}的ASCII差2
        //不是左括号们,栈非空,当前和栈顶不配对,不符合
        else return false;
    }
    //最后栈为空则符合,不为空则不符合
    return top == -1;
}

//JS

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let stackArr = [], popStr = '';
    for(let i = 0; i < s.length; i++){
        if(s[i] == '(' || s[i] == '[' || s[i] == '{') stackArr.push(s[i]);
        else if(stackArr.length == 0) return false;
        else{
            popStr = stackArr.pop();
            if(s[i].charCodeAt() == popStr.charCodeAt() + 1 || s[i].charCodeAt() == popStr.charCodeAt() + 2) continue;
            else return false;
        }
    }
    return stackArr.length == 0;
};

  

 

posted @ 2020-05-26 18:48  Jessey45  阅读(149)  评论(0编辑  收藏  举报