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语言计算大数阶乘的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • c++下迭代器总结

    c++下迭代器总结

    大家好,本篇文章主要讲的是c++下迭代器总结,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 聊一聊C++虚函数表的问题

    聊一聊C++虚函数表的问题

    C++是面向对象的语言(与C语言主要区别),所以C++也拥有多态的特性。下面通过代码看下C++虚函数表的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • c语言实现简易版三子棋(附完整代码)

    c语言实现简易版三子棋(附完整代码)

    大家好,本篇文章主要讲的是c语言实现简易版三子棋(附完整代码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++  STL _ Vector使用及模拟实现

    C++  STL _ Vector使用及模拟实现

    这篇文章主要介绍了C++ STL_Vector使用及模拟实现,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • C语言库的封装和使用方法总结

    C语言库的封装和使用方法总结

    在编程的过程中,使用已经封装好的库函数是十分方便的,也是十分高效的,这篇文章主要给大家介绍了关于C语言库的封装和使用的相关资料,需要的朋友可以参考下
    2021-07-07
  • C语言基础知识点解析(extern,static,typedef,const)

    C语言基础知识点解析(extern,static,typedef,const)

    本篇文章是对C语言基础知识点(extern,static,typedef,const)的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-10-10
  • C++实现LeetCode(95.独一无二的二叉搜索树之二)

    C++实现LeetCode(95.独一无二的二叉搜索树之二)

    这篇文章主要介绍了C++实现LeetCode(95.独一无二的二叉搜索树之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现通讯录小功能

    C++实现通讯录小功能

    这篇文章主要为大家详细介绍了C++实现通讯录小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中的自增与自减

    C++中的自增与自减

    这篇文章主要介绍了C++中的自增与自减,自增与自减是C++当中两个使用频率非常高的运算符,不仅在循环当中用到,在日常的代码当中也经常使用,下面来看看文章得具体介绍
    2021-11-11

最新评论