直接回答:用栈。遍历字符串,遇到左括号压栈;遇到右括号时,若栈为空或栈顶不是与它匹配的左括号则判定无效,否则弹栈继续。遍历结束后栈为空则有效。时间复杂度 O(n),空间 O(n)。

展开解析:这题考察栈的「最近匹配」语义——右括号永远要和它之前最近的那个未匹配左括号配对,这正是后进先出。实现上可以用哈希表预存右括号到左括号的映射,分支判断更干净;注意空字符串约定为有效。常见变体与追问:只含一种括号时可用计数器代替栈(遇左 +1、遇右 −1,中途变负即失败),空间降到 O(1);「生成 n 对合法括号」用回溯加剪枝(左括号数不超过 n、右括号数不超过左括号数);「最长有效括号子串」可用栈存下标或动态规划。

示例

def is_valid(s: str) -> bool:
    pairs = {')': '(', ']': '[', '}': '{'}
    stack = []
    for ch in s:
        if ch in '([{':
            stack.append(ch)
        elif ch in pairs:
            if not stack or stack.pop() != pairs[ch]:
                return False
    return not stack