leetcode
leetcode 801 ~ 850
使括号有效的最少添加

使括号有效的最少添加

难度:

标签:

题目描述

代码结果

运行时间: 19 ms, 内存: 16.1 MB


// Java Stream solution
// Problem: Given a string s consisting of '(' and ')', return the minimum number of parentheses we must add to make the resulting string valid.
// Approach: Use IntStream to iterate through the string and calculate the necessary number of parentheses to add.
import java.util.stream.IntStream;

public class SolutionStream {
    public int minAddToMakeValid(String s) {
        int leftBrackets = 0; // Number of unmatched '(' brackets
        int rightBracketsToAdd = 0; // Number of ')' brackets to add

        rightBracketsToAdd = IntStream.range(0, s.length())
            .map(i -> s.charAt(i) == '(' ? 1 : -1)
            .reduce(0, (balance, x) -> {
                if (balance + x < 0) {
                    rightBracketsToAdd++;
                    return balance;
                }
                return balance + x;
            });

        return leftBrackets + rightBracketsToAdd;
    }
}

解释

方法:

本题解采用栈来处理括号匹配问题,从而计算使括号字符串有效所需的最少括号数。遍历给定字符串s中的每个字符,使用栈来跟踪未匹配的括号。对于每个遇到的'(',将其推入栈中。对于每个遇到的')',首先检查栈是否为空或栈顶元素是否不是'(',若是,则将')'推入栈;若不是,则从栈中弹出一个'(',表示匹配成功。最终栈中剩余的元素数量即为需要添加的括号数,因为这些是未能匹配的括号。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么选择使用栈作为数据结构来解决这个问题?有没有其他数据结构也可以解决同样的问题?
栈是解决括号匹配问题的理想选择,因为它能够有效地处理最近未匹配的括号,并且支持后进先出(LIFO)的操作方式,这是处理嵌套结构的关键。当遇到一个右括号时,最近的左括号应该与之匹配,这正是栈结构所擅长的。虽然也可以使用其他数据结构,如队列或列表来模拟这个过程,但他们要么不支持高效的后进先出操作,要么操作复杂度较高,不如栈直观或高效。
🦆
在算法中,你是如何处理连续多个 ')' 字符的情况的,能否详细说明其对栈的影响?
当遇到连续多个 ')' 字符时,算法会逐个检查每个 ')'。对于每个 ')',如果当前栈非空且栈顶元素是 '(',则栈顶的 '(' 会被弹出,表示一对括号成功匹配。如果栈为空或栈顶不是 '(',则当前的 ')' 会被推入栈中,表示这个 ')' 目前未能找到匹配的 '('。这样处理连续的 ')' 会导致栈中累积多个未匹配的 ')',这些都需要在最后统计未匹配括号的数量时考虑。
🦆
在代码中对于 ')' 的处理逻辑中,存在 `len(stack) != 0` 的判断,请问在什么情况下这个条件是必需的?
这个条件是必需的,因为它防止在栈为空的情况下执行 pop 操作,这会导致错误。当栈为空且遇到 ')' 时,说明没有之前的 '(' 可以与之匹配,因此必须将 ')' 直接添加到栈中,表示这个 ')' 是未匹配的。如果没有这个条件,尝试弹出空栈将会引发错误。
🦆
你提到栈中剩余的元素数量即为需要添加的括号数,这里是否包括了所有情况,比如全部是 '(' 或全部是 ')' 的情况?
是的,这里包括了所有情况。如果输入字符串全部是 '(',那么这些 '(' 都将被推入栈中并留在栈里,因为没有 ')' 来与之匹配。如果全部是 ')',则每一个 ')' 都将被推入栈中,因为没有 '(' 来匹配。在这两种情况下,栈中剩余元素的数量(无论是 '(' 还是 ')')都正是为了使字符串有效而需要添加的括号数量。

相关问题