Java C++题解leetcode856括号的分数

 更新时间:2022年10月17日 11:37:23   作者:AnjaVon  
这篇文章主要为大家介绍了Java C++题解leetcode856括号的分数实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

思路一:栈

Java

class Solution {
    public int scoreOfParentheses(String s) {
        Deque<Integer> sta = new ArrayDeque<>();
        sta.addLast(0);
        for (char c : s.toCharArray()) {
            if (c == '(')
                sta.addLast(0);
            else { // 结束一个括号
                int cur = sta.pollLast(); // 取出当前分数
                sta.addLast(sta.pollLast() + Math.max(cur * 2, 1)); // 更新上级括号分数
            }
        }
        return sta.peekLast();
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

C++

class Solution {
public:
    int scoreOfParentheses(string s) {
        stack<int> sta;
        sta.push(0); // 初始0用于记录结果分数
        for (auto c : s) {
            if (c == '(')
                sta.push(0);
            else { // 结束一个括号
                int cur = sta.top(); // 取出当前分数
                sta.pop();
                sta.top() += max(cur * 2, 1); // 更新上级括号分数
            }
        }
        return sta.top();
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

Rust

impl Solution {
    pub fn score_of_parentheses(s: String) -> i32 {
        let mut sta = Vec::with_capacity((s.len() >> 1) + 1);
        sta.push(0); // 初始0用于记录结果分数
        for c in s.bytes() {
            if c == b'(' {
                sta.push(0);
            }
            else {
                let cur = sta.pop().unwrap();
                *sta.last_mut().unwrap() += 1.max(cur << 1);
            }
        }
        sta[0]
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

思路二:模拟计算

  • 略去栈,直接记录分数;
  • 根据题意发现其实分数来源就只是(),所以记录其所在深度depth考虑乘几个222,然后累加到答案上即可。
  • 因为第一个字符一定是(,所以默认深度为1,遍历字符串时直接掠过s[0]。

Java

class Solution {
    public int scoreOfParentheses(String s) {
        int depth = 1, res = 0;
        for (int i = 1; i < s.length(); i++) {
            depth += (s.charAt(i) == '(' ? 1 : -1);
            if (s.charAt(i - 1) == '(' && s.charAt(i) == ')') // 分数来源
                res += 1 << depth;
        }
        return res;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

C++

class Solution {
public:
    int scoreOfParentheses(string s) {
       int depth = 1, res = 0;
        for (int i = 1; i < s.size(); i++) {
            depth += (s[i] == '(' ? 1 : -1);
            if (s[i - 1] == '(' && s[i] == ')') // 分数来源
                res += 1 << depth;
        }
        return res;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

Rust

impl Solution {
    pub fn score_of_parentheses(s: String) -> i32 {
        let (mut depth, mut res) = (1, 0);
        let ss = s.as_bytes();
        for i in 1..s.len() {
            if (ss[i] == b'(') {
                depth += 1
            }
            else {
                depth -= 1;
                if ss[i - 1] == b'(' { // 分数来源
                    res += 1 << depth;
                }
            }
        }
        res
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

总结

自己想到的方法有点类似两种结合,用栈记录分数来源的括号并记录最后计算分数,没有意识到可以直接累加计算,顺序不影响结果。

以上就是Java C++题解leetcode856括号的分数的详细内容,更多关于Java C++ 括号的分数的资料请关注脚本之家其它相关文章!

相关文章

  • C/C++实现线性顺序表的示例代码

    C/C++实现线性顺序表的示例代码

    使用顺序存储结构的线性存储结构的表为线性顺序表。本文将分别利用C语言和C++实现线性顺序表,文中示例代码讲解详细,需要的可以参考一下
    2022-05-05
  • 使用C语言绘制柱形图的示例代码

    使用C语言绘制柱形图的示例代码

    常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图,这篇文章主要为大家介绍了C语言中绘制条形图和柱形图的方法,需要的可以参考下
    2024-02-02
  • C语言打印华氏-摄氏温度对照表的方法

    C语言打印华氏-摄氏温度对照表的方法

    这篇文章主要介绍了C语言打印华氏-摄氏温度对照表的方法,涉及C语言字符串与数字操作的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • C++缺省参数与重载函数(超详细!)

    C++缺省参数与重载函数(超详细!)

    无论使用什么语言函数都是代码段中必不可少的部分,因此我们有必要深入认识一下C++中函数的两种特殊用法,缺省参数,函数重载,这篇文章主要给大家介绍了关于C++缺省参数与重载函数的相关资料,需要的朋友可以参考下
    2024-06-06
  • C语言算法积累图的遍历邻接表简单路径

    C语言算法积累图的遍历邻接表简单路径

    这篇文章主要为大家介绍了C语言算法积累图的遍历邻接表简单路径实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 详解C语言之柔性数组

    详解C语言之柔性数组

    这篇文章主要介绍了C语言柔性数组,通过实例分析了不完整类型、结构体及柔性数组等概念,需要的朋友可以参考下
    2021-11-11
  • C语言使用顺序表实现电话本功能

    C语言使用顺序表实现电话本功能

    这篇文章主要为大家详细介绍了C语言使用顺序表实现电话本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言中extern详细用法解析

    C语言中extern详细用法解析

    这篇文章主要介绍了C语言中extern详细用法解析,本文讲解的extern也是C语言中的关键词,用来修饰函数声明或变量等,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ 超详细讲解stack与queue的使用

    C++ 超详细讲解stack与queue的使用

    C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构,许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列
    2022-03-03
  • C++17实现flyweight_factory模板类及使用示例详解

    C++17实现flyweight_factory模板类及使用示例详解

    这篇文章主要为大家介绍了C++17实现flyweight_factory模板类及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论