leetcode 856. 括号的分数

  1. 题目链接 https://leetcode-cn.com/problems/score-of-parentheses/submissions/

  2. 题目描述

    1. 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

    2. () 得 1 分。
    3. AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
    4. (A) 得 2 * A 分,其中 A 是平衡括号字符串。
    5. 示例 1:

      输入: "()"
      输出: 1
      

      示例 2:

      输入: "(())"
      输出: 2
      

      示例 3:

      输入: "()()"
      输出: 2
      

      示例 4:

      输入: "(()(()))"
      输出: 6
      
  3. 解题思路

    1. 模拟栈,遍历字符串S,"("时入栈,不然出栈,若栈顶元素为“(”时 入栈 1,否则就一直出栈直到栈顶为“(”,将所有出栈的元素加和乘2.最后返回栈元素的和。
  4. 代码

    1. python
      class Solution:
          def scoreOfParentheses(self, S: str) -> int:
              st = []
              for s in S:
                  if s == '(':
                      st.append(s)
                  elif st[-1] == '(':
                      st[-1] = 1
                  else:
                      tmp = 0
                      while st[-1] != '(':
                          tmp += st.pop()
                      st[-1] = tmp * 2
              return sum(st)

       

    2. c++(位运算代替乘法)
      class Solution {
      public:
          int scoreOfParentheses(string S) {
              int res = 0, w = 0;
              for(int i = 0; i < S.length(); ++i){
                  if(S[i] == '(')
                      w = w? w << 1: 1;
                  else if(S[i - 1] == '('){
                      res += w;
                      w >>= 1;
                  }else
                      w >>= 1;
              }
              return res;
          }
      };

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值