• 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] != ''){
            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;
    };
    

      

  • 相关阅读:
    函数指针与函数声明
    long和int的区别
    pthread_create传递参数
    C语言中的static 详细分析
    linux 读写锁应用实例
    linux使用读写锁pthread_rwlock_t
    linux的<pthread.h>
    时间:UTC时间、GMT时间、本地时间、Unix时间戳
    等号赋值与memcpy的效率问题
    单链表带头结点&不带头结点
  • 原文地址:https://www.cnblogs.com/JesseyWang/p/12964210.html
Copyright © 2020-2023  润新知