856. 括号的分数:栈的思想

简介: 这是 力扣上的 856. 括号的分数:,难度为 中等。

题目描述

这是 力扣上的 856. 括号的分数:,难度为 中等

image.png

题目分析

题目言简意赅,就是要我们按照给出的 3 种规则来计算输入的字符串中,括号的最终得分

  • () 记 1 分
  • ()() 记 2 分,即 1+1
  • (()) 记 2 分,即 2*1

那么对于这三种情况,实际上就已经覆盖了输入字符串括号的所有组合,咱们仅仅是去一层一层的拨开洋葱的心而已


思考:

那么我们如何处理好上述三种情况的各种组合呢?

看到括号,我第一时间会想到使用栈的方式,但是咱们今天使用的栈并不是将括号入栈哦,而是我们要将目前的分数入栈,然后模拟这一个遍历括号的过程和计算分数的过程

我们输入的字符串的时候,我们自然是会遇到左括号(和右括号),对于这俩我们需要不同情况不同对待

我们可以初始化一个存放 int 类型数据的栈,默认写一个 0 进去,表示当前得分为 0

  • 左括号( 是一个括号的起始位置,当遍历输入字符串,遇到左括号( 的时候,那么此时也还是不能得分的,因此我们可以向栈中追加一个 0 进去

那么,我们遍历的时候遇到右括号)的情况我们需要如何来处理呢?

  • 当我们遇到右括号)的时候,弹出当前元素的值,如果当前栈顶的元素的值是 0,那么很明显,当前右括号)的前一个元素必然是左括号(,这个时候咱们直接记 1 分就可以了,仅仅是说明本次的 右括号)已经配对了一个平衡括号()我们是需要将这个值和当前的栈顶元素求和的

image.png

因为,当前情况还会存在 ()() 的情况,此时我们遍历到最后一个右括号的时候,最新的栈顶是 1 ,然后我们将当前的1 与栈顶求和, 即得到新的栈顶 2

image.png

  • 对于遇到右括号),还剩下最后一个情况,那就是(()) 情况,我们是需要进行乘以 2 的

image.png

还是同样的道理,当我们遍历到最后一个右括号的时候,此时,我们是可以发现栈顶的值是 1 ,那么这个时候同理,我们将弹出栈顶元素,2*当前栈顶元素的结果 与 最新的栈的栈顶元素求和即可

那么,我们遇到右括号 ) 的时候,如何区分 是()() 还是 (())?

很简单,咱们遇到 ()() 的时候,遍历到最后一个右括号的时候,当前弹出的栈顶元素是 0,而 (()) 对应的是一个大于零的数

因此,咱们再和最新的栈进行求和的时候需要 max(2 * 之前栈顶的元素, 1),这样说会不会更清晰了呢

接下来,咱们就可以来实现编码了,咱们这次使用 golang 的方式来进行实现

Golang 的实现方式:

func scoreOfParentheses(s string) int {
    // 使用栈的思想来进行实现
    ans := []int{0}
    for _,c := range s {
        if c == '(' {
            // 遇到左括号的时候无脑向 ans 栈里面补零
            ans = append(ans, 0)
        } else {
            //  遇到右括号的时候,此时需要注意是 )) 的情况,还是() 的情况,
            // 第 1 种 情况是前面的栈顶已经有大于 0 的值了
            // 第 2 种 情况是,前面的栈顶肯定是 0,因此前面是 (
            tmp := ans[len(ans) -1]
            ans = ans[:len(ans) -1]
            ans[len(ans) -1] += max(2*tmp, 1)
        }
    }
    return ans[0]
}
func max(a,b int) int {
    if a>b {
        return a
    }
    return b
}

这种实现方式,咱们的时间复杂度是 O(n),此处的 n 是表示输入字符串的长度 ,空间复杂度是O(n),咱们引入了切片来模拟占空间

今天就到这里,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~



相关文章
|
3天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
01_设计一个有getMin功能的栈
01_设计一个有getMin功能的栈
|
4天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
06_用栈来求解汉诺塔问题
06_用栈来求解汉诺塔问题
05_用一个栈实现另一个栈的排序
05_用一个栈实现另一个栈的排序
03_如何仅用递归函数和栈操作逆序一个栈
03_如何仅用递归函数和栈操作逆序一个栈
|
4天前
|
测试技术
02_由两个栈组成的队列
02_由两个栈组成的队列
|
7天前
|
存储
|
22天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
5天前
|
安全 JavaScript 前端开发
栈溢出漏洞传播Worm.Delf.yqz
栈溢出漏洞传播Worm.Delf.yqz