LeetCode之HOT100--020 有效的括号

211 阅读1分钟

「这是我参与11月更文挑战的11天,活动详情查看:2021最后一次更文挑战」。

前言

一直都计划学习数据结构与基本算法,但是平时都看一阵停一阵。现在决心坚持下去,我准备从LeetCode的HOT100开始,每天完成1~2道习题,希望通过这种方式养成持续学习的习惯。因为我是做iOS开发的,主要是用Objective-C语言,最近也在学习Swift,所以本系列的题解都将使用swift语言完成,本文更新的是LeetCode中HOT100的第11题020 有效的括号。

题目

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

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

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

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

分析

本题的目的很简单,判断字符串中左右括号是否符合要求。在这里我们需要注意的是每一种左括号和对应的右括号的数量要对等,除此之外,我们还需要注意左括号和对应右括号的位置,示例4中就是数量对称但是位置交错。
所以,为了解决这个问题,我们采用 的思路来解决该问题,我们从左往右读字符串,遇到左括号,就将其入栈,遇到右括号,则判断当前栈顶元素是否是与其对应的左括号,如果不是则不称,直接返回false,如果是则将栈顶元素出栈,继续往后读。具体思路如下:

1、 初始化一个字典matches表示各类右括号对应的左括号,方便后续进行判断,初始化一个空数组stack用来存放当前未匹配的左括号,初始化ch为字符串的第一个字符
2、如果ch为左括号类型,则将ch添加到stack的最后面
3、如果ch为右括号类型,判断stack最后的元素是否与ch相匹配,如果不匹配,则直接返回false,over。如果匹配,则将stack中的最后元素删除
4、如果没有over,则将ch后移一位元素,继续步骤2~步骤4,直到over 或者 字符串最后
5、字符串遍历结束后如果stack中若没有元素,则表示全部匹配成功,返回true,否则返回false

题解

class KLLC020 {

    func isValid(_ s: String) -> Bool {
        //因为左右括号要成对出现,所以如果字符串字符数量为奇数,则直接返回false
        if s.count % 2 == 1 {
            return false
        }
        //初始化左右括号的对应关系
        let matches:Dictionary<Character, Character> = [
            ")":"(",
            "]":"[",
            "}":"{"
        ]
        //初始化保存未匹配的左括号数组
        var stack = [Character]()
        for ch in s {
            if ch == "(" || ch == "[" || ch == "{" {
                //如果是左括号,则直接添加到stack的最后
                stack.append(ch)
            } else {
                //如果是右括号,则判断是否与栈顶左括号匹配,不匹配则over,匹配则删除栈顶左括号元素
                let matchCh:Character = matches[ch] ?? " "
                let topCh:Character = stack.last ?? "a"
                if matchCh != topCh {
                    return false
                } else {
                    stack.removeLast()
                }
            }
        }
        //遍历结束后 栈为空表示全部匹配成功,否则不成功
        return stack.isEmpty
    }
}