Leetcode 20. 有效的括号

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;
}

你可能感兴趣的:(Leetcode,算法竞赛,leetcode,算法,职场和发展)