Leetcode 20. 有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()” 输出:true

示例 2:

输入:s = “()[]{}” 输出:true

示例 3:

输入:s = “(]” 输出:false

示例 4:

输入:s = “([)]” 输出:false

示例 5:

输入:s = “{[]}” 输出:true

提示:

1 <= s.length <= 104
s 仅由括号 ()[]{} 组成

思路

因为括号是成对匹配的,现有前括号,再有后括号, 所以从前往后遍历字符串s,遇到左括号就把对应的右括号入栈,遇到右括号就和栈顶元素对比,相同就消去并继续操作,不相同则直接返回0;

不匹配大概有一下几种情况 1.左右括号不匹配 2.左括号多 3.右括号多

1.不匹配的情况直接判断judge的返回值即可 2.左括号多,就是遍历结束之后栈不为空,最后的时候判断一下top是否等于零就好 3.右括号多,就是便利的时候发现栈是空的,没有可以与之匹配的括号,在输入的字符是右括号的时候判断一下栈是否为空即可

代码

/*应该用栈,后入先出*/

int judge(char c, int top, char* vis) {
          
   
    int p = 1;
    if (vis[top - 1] == c) {
          
   
        top--;
    }
    else p = 0;

    return p;
}
bool isValid(char * s){
          
   
    char vis[10005];
    int top = 0;
    int flag = 1;
    int len = strlen(s);

    int i = 0;

    for (i = 0; i < len; i++) {
          
   
        if (s[i] == {) {
          
   
            vis[top++] = };
        }
        else if (s[i] == [) {
          
   
            vis[top++] = ];
        }
        else if (s[i] == () {
          
   
            vis[top++] = );
        }
        else {
          
   
//            if (!top) return 0;
            if (!top || judge(s[i], top, vis) == 0)  return 0;
            else top--;
        }
    }
    return top == 0;
}
经验分享 程序员 微信小程序 职场和发展