一天一道算法题(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 篇,本系列将持续更新,每篇都提供清晰的思路与编程语言实现。欢迎关注,第一时间获取更新。如果你有想看的题目,也可以在评论区留言告诉我。

相关推荐
渡之1 小时前
ArduPilot(APM)滤波器之 HarmonicNotchFilter 深度解析
算法·无人机
爱吃苹果的梨叔1 小时前
AI 算力监控中心怎么建?分布式坐席 + 大屏联动 + 过程回放
人工智能·分布式·python
JarmanYuo1 小时前
YOLO 涨点研究(六):网络结构改进之小目标增强篇1——无人机视角下的车辆与行人检测
人工智能·pytorch·python·yolo·计算机视觉·无人机
2601_962297251 小时前
python自带缓存lru_cache用法及扩展的使用_python
python·缓存·装饰器·lru_cache·my_cache
凯尔萨厮1 小时前
Java学习笔记十五(GUI)
java·笔记·学习
招财小梗1 小时前
沈阳AI企业咨询可定制数字化方案吗?
大数据·人工智能·python
落木萧萧8251 小时前
MyBatis 关联查询的四种写法,为什么最后都变回了手写 XML
java·数据库·后端
csdn2015_1 小时前
java springboot项目,接收到的参数多个逗号
java·开发语言·spring boot
cui_hao_nan1 小时前
Spring AOP 自调用、代理与 private 方法引发的诡异 NPE
java·后端·spring·ai开发