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

相关推荐
VidDown2 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
leobertlan2 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的2 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8263 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
开发小能手1233 小时前
答案daanC语言
数据结构·算法
小 黄 鸡3 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频3 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林4 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
Navigator_Z4 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
伯恩bourne5 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端