当前位置:主页 > c/c++教程 > Java C++ 括号的分数

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

发布:2023-03-05 09:30:01 59


为网友们分享了相关的编程文章,网友关淑华根据主题投稿了本篇教程内容,涉及到Java、C++、括号的分数、Java、C++、leetcode题解、Java C++ 括号的分数相关内容,已被256网友关注,内容中涉及的知识点可以在下方直接下载获取。

Java C++ 括号的分数

题目要求

思路一:栈

Java

class Solution {
    public int scoreOfParentheses(String s) {
        Deque 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 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++通信新特性协程详细介绍

    发布:2023-03-08

    这篇文章主要给大家分享得是C++的特性协程Coroutine,下面文章内容我们将来具体介绍什么是协程,协程得好处等知识点,需要的朋友可以参考一下


  • Java虚拟机对内部锁优化方式整理

    发布:2020-02-04

    这篇文章主要介绍了浅谈Java虚拟机对内部锁的四种优化方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • Java四种访问控制修饰符知识点总结

    Java四种访问控制修饰符知识点总结

    发布:2022-10-26

    给网友朋友们带来一篇关于Java的教程,本篇文章给大家详细分析了Java四种访问控制修饰符的相关知识点,有兴趣的朋友可以参考学习下。


  • Java的内存区域与内存溢出异常你了解吗

    Java的内存区域与内存溢出异常你了解吗

    发布:2022-10-09

    给网友们整理关于Java的教程,这篇文章主要为大家详细介绍了Java的内存区域与内存溢出异常,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助


  • 三分钟带你掌握Java开发图片验证码功能方法

    发布:2023-04-05

    这篇文章主要来为大家详细介绍Java实现开发图片验证码的具体方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下


  • Java实现快速排序原理分析

    发布:2019-06-17

    今天小编就为大家分享一篇关于Java实现快速排序过程分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


  • Windows下sentry接入C/C++程序的详细过程

    发布:2023-03-02

    sentry作为一个开源的软件,发展至今,已经非常成熟。它支持的平台众多,甚至于针对不同的工作者(后台、前端、客户端)都有相应的内容,这篇文章主要介绍了Windows下sentry接入C/C++程序,需要的朋友可以参考下


  • Java AQS(AbstractQueuedSynchronizer)源码解析

    发布:2023-04-09

    AbstractQueuedSynchronizer被称为队列同步器,简称为大家熟知的AQS,这个类可以称作concurrent包的基础。本文将通过剖析源码来看看AQS是如何工作的,感兴趣的可以了解一下


网友讨论