有效的括号

Posted by zhouqian on Thursday, June 23, 2022

力扣 20. 有效的括号

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

有效字符串需满足:

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

方案一:利用 最近相关性,遍历字符串,将元素顺序入栈,如果遍历到右括号,就判断上个元素和当前元素是否能构成有效括号。

func isValid(s string) bool {
    // s 长度是奇数,就不可能构成有效括号对
    if len(s) % 2 == 1 {
        return false
    }

    // 定义集合,保存有效括号对信息
    pairs := map[int32]int32{
        '}': '{',
        ')': '(',
        ']': '[',
    }
    // 定义栈
    stk := make([]int32, 0, len(s))
    // 遍历 s 每个元素
    for _, x := range s {
        // 判断当前是否是右括号
        v, ok := pairs[x]
        // 当前是左括号,将括号入栈
        if !ok {
            stk = append(stk, x)
            continue
        }
        
        // 当前是右括号,但栈为空,即 s 前面部分没有对应左括号
        // 或者此前入栈的括号和当前遍历到的右括号不匹配
        if len(stk) == 0 || stk[len(stk) - 1] != v{
            return false
        }
        // 此前入栈的括号和当前括号构成有效括号
        // 将此前入栈的括号出栈
        stk = stk[:len(stk) - 1]
    }
    return len(stk) == 0
}
  • 时间复杂度:O(n),因为需要遍历所有字符串中所有字符,所以时间复杂度为 O(n)。
  • 空间复杂度:O(n),因为使用了一个长度不超过 n 的栈辅助计算,所以空间复杂度为 O(n)。