20. 有效的括号

861 阅读1分钟

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例

示例 1:
输入:s = "()"
输出:true

示例 2:
输入:s = "()[]{}"
输出:true

示例 3:
输入:s = "(]"
输出:false

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/va…

实现

// 根据左括号得出右括号
char charMatch(char c)
{
    if (c == '(') {
        return ')';
    } else if (c == '{') {
        return '}';
    } else if (c == '[') {
        return ']';
    } else {
        return -1;
    }
}

bool isValid(char *s)
{
    // 根据题意用栈解决最方便
    if (strlen(s) % 2 != 0) {
        return false;     // 奇数一定不会完全匹配
    }
    int top = -1;         // 栈顶指针
    char st[strlen(s) + 1];
    memset(st, 0, strlen(s) + 1);
    for (int i = 0; i < strlen(s); i++) {
        if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
            st[++top] = charMatch(s[i]);
        } else {
            if (top == -1) {
                return false;    // 直接是右括号,那么直接返回false
            }
            if (st[top] != s[i]) {
                return false;    // 右括号与最近的左括号不匹配,返回false
            }
            top--;               // top位置的字符已经匹配,出栈
        }
    }
    if (top == -1) {
        return true;             // 表明栈中没有不匹配的元素了,返回true
    }
    return false;                // 匹配结束,栈中还有元素,返回false
}