一天一道算法题(26):栈的简单应用

20. 有效的括号

文章目录

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

**输入:**s = "()"

**输出:**true

示例 2:

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

**输出:**true

示例 3:

**输入:**s = "(]"

**输出:**false

示例 4:

**输入:**s = "(\[\])"

**输出:**true

示例 5:

**输入:**s = "()"

**输出:**false

思路

- 栈

  • 我们对s遍历,使用一个栈记录,如果是左边的括号,那就直接入栈,如果是右边的括号,那就出栈,把当前出栈的元素和被遍历到的元素一起判断一下,如果是一对,那就继续,如果不是就直接返回false

  • 代码演示

go 复制代码
//可以用函数比较,也可以用哈希表
func isValid(s string) bool {
    pairs := map[rune]rune{
        ')': '(',
        ']': '[',
        '}': '{',
    }
    stack := []rune{}
    
    for _, v := range s {
        if v == '(' || v == '[' || v == '{' {
            stack = append(stack, v)
        } else {
            //判断,如果是stack的长度是0的时候还进入到了这一层,说明此时只有右括号,没有左括号,直接返回fasle即可
            if len(stack) == 0 || stack[len(stack)-1] != pairs[v] {
                return false
            }
            stack = stack[:len(stack)-1]
        }
    }
    //这里思路很奇特,因为我们有可能碰到一种情况,就是s里面只有一个左括号,那我们在入栈之后就直接退出了,但是事实上还没有组成一个完整的括号,所以我们需要栈的长度判断是否等于0,这里直接把判断的返回值返回,非常简洁
    return len(stack) == 0
}
go 复制代码
if len(stack) == 0 || stack[len(stack)-1] != pairs[v] {
    return false
}

//函数的话就是在判断是否可以组合为正确的括号时把两个参数穿进去判断
//函数的逻辑也很简单
//用函数的返回值判断,如果是false,那就直接返回fasle
if len(stack) == 0 || !compare(stack[len(stack)-1], v) {
    return false
}

func compare(a, b rune) bool {
    if a == '[' && b == ']' {
        return true
    } else if a == '(' && b == ')' {
        return true
    } else if a == '{' && b == '}' {
        return true
    } else {
        return false
    }
}
//优化一下代码

总结

本文是 《算法题目解析系列》 的第 26 篇,本系列将持续更新,每篇都提供清晰的思路与编程语言实现。欢迎关注,第一时间获取更新。如果你有想看的题目,也可以在评论区留言告诉我。

相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商