当前位置 : 主页 > 编程语言 > c语言 >

JavaC++题解leetcode856括号的分数

来源:互联网 收集:自由互联 发布时间:2023-02-01
目录 题目要求 思路一:栈 Java C++ Rust 思路二:模拟计算 Java C++ Rust 总结 题目要求 思路一:栈 Java class Solution { public int scoreOfParentheses(String s) { DequeInteger sta = new ArrayDeque(); sta.addLast(0)
目录
  • 题目要求
  • 思路一:栈
    • Java
    • C++
    • Rust
  • 思路二:模拟计算
    • Java
    • C++
    • Rust
  • 总结

    题目要求

    思路一:栈

    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++静态库之间相互调用的实战案例
    下一篇:没有了
    网友评论