📌  相关文章
📜  要添加的最小括号数以使其有效(1)

📅  最后修改于: 2023-12-03 15:11:55.961000             🧑  作者: Mango

要添加的最小括号数以使其有效

在编写代码时,我们经常需要处理字符串,并验证其中的括号是否匹配。如果括号不匹配,代码可能会出现错误或导致意外结果。因此,我们需要一种方法来检查括号是否匹配,并在其中添加必要的括号以使其有效。

本文将介绍如何使用栈(Stack)来解决此问题并计算要添加的最小括号数以使其有效。我们将从以下几个方面来讲解:

  1. 问题描述
  2. 解决方案
  3. 代码实现
  4. 总结
问题描述

给定一个由左、右括号和小写字母组成的字符串,编写一个函数来检查其中的括号是否匹配。要求添加最少的括号使其有效。

示例 1:

输入:"()())()"
输出:2
说明:需要添加一对括号,"()"和一个右括号")",才能使其有效:"()()()()"

示例 2:

输入:"((("
输出:3
说明:需要添加三个右括号")"才能使其有效:"((()))"

示例 3:

输入:"))(("
输出:4
说明:需要添加两对括号,"()"和")(",才能使其有效:"()()()"
解决方案

本问题可以使用栈(Stack)来解决。我们可以遍历字符串中的每个字符,并将左括号压入栈中。当出现右括号时,我们可以弹出一个左括号,如果弹出的括号不匹配,则需要添加括号使其匹配。

具体步骤如下:

  1. 创建一个空栈。
  2. 遍历字符串中的每个字符:
    1. 如果当前字符是左括号,则将其压入栈中。
    2. 如果当前字符是右括号:
      1. 如果栈为空,则需要添加一个左括号。
      2. 如果栈不为空且栈顶元素是左括号,则将其弹出。
      3. 如果栈不为空且栈顶元素不是左括号,则需要添加一个左括号。
  3. 统计栈中剩余的左括号个数,即为需要添加的最小括号数。
代码实现

下面是 Python 代码实现:

def min_valid_parentheses(s: str) -> int:
    stack = []
    count = 0
    for c in s:
        if c == '(':
            stack.append(c)
        elif c == ')':
            if not stack:
                count += 1
            elif stack[-1] == '(':
                stack.pop()
            else:
                count += 1
    count += len(stack)
    return count

下面是 JavaScript 代码实现:

function minValidParentheses(s) {
  const stack = [];
  let count = 0;
  for (const c of s) {
    if (c === '(') {
      stack.push(c);
    } else if (c === ')') {
      if (!stack.length) {
        count++;
      } else if (stack[stack.length - 1] === '(') {
        stack.pop();
      } else {
        count++;
      }
    }
  }
  count += stack.length;
  return count;
}
总结

本文介绍了使用栈来计算需要添加的最小括号数以使其有效。根据题意,我们可以在遇到不匹配的右括号时添加一个左括号,或在最后统计栈中剩余的左括号个数。代码实现较为简单,但需要注意特殊情况的处理。对于巩固栈的应用及括号匹配问题有一定帮助。