【腾讯精选练习50题】20. 有效的括号(简单)

218 阅读1分钟

题目描述

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

有效字符串需满足:

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

提示:

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

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([)]"

输出:false

示例 5:

输入:s = "{[]}"

输出:true

思路分析

  • 这个题目毋庸置疑,想到的就是利用栈的特性
  • 比较麻烦的是,go里面没有现成的栈,需要自己想办法去构造
  • 还有一些小细节,比如判断字符串长度,如果是单数肯定不匹配

AC代码

// 执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
// 内存消耗:2 MB, 在所有 Go 提交中击败了61.85%的用户
func isValid(s string) bool {
    // 这里其实挺巧妙的,一开始还没想到
    if len(s) % 2 == 1 {
        return false
    }

    dataMap := map[byte]byte{
        ')': '(',
        ']': '[',
        '}': '{',
    }

    // golang使用slice实现栈的作用。尾部为栈顶
    // 通过append入栈,截取出栈
    var stack []byte

    for i := 0; i < len(s); i++ {
        // 判断是不时右边的括号
        if dataMap[s[i]] > 0 {
            // 判断是否栈空、栈顶元素是否匹配
            if len(stack) == 0 || stack[len(stack) - 1] != dataMap[s[i]] {
                return false
            }
            stack = stack[0:len(stack) - 1]
        } else {
            stack = append(stack, s[i])
        }
    }

    return len(stack) == 0
}

总结

  • 不同编程语言掌握程度,对解题也是蛮有影响的