使用Python查找平衡括号字符串的最小插入次数

使用Python查找平衡括号字符串的最小插入次数

背景和问题

在编程中,经常需要处理括号序列。例如,判断一个括号序列是否“平衡”,即左右括号匹配且左右括号数量相同。

例如,以下括号序列都是平衡的:

()
(())
({[]})

而以下括号序列不平衡:

((()
)()
{[}]

对于不平衡括号序列,可以通过在其中插入一些括号使其变为平衡。例如,对于括号序列 ((),可以插入一个右括号 ),变为平衡序列 ()。对于括号序列 ()),则需要插入两个左右括号,变为平衡序列 ()()

给定一个不平衡的括号序列,如何计算最少需要插入几个括号才能使其变为平衡的?

方法:栈

对于括号序列问题,栈可能是最自然的数据结构选取。一个基本的思路是:从左到右扫描括号序列,在扫描过程中通过栈来维护左右括号的匹配关系。

具体来说,遍历括号序列,对于每个括号,有以下两种情况:

  • 如果是一个左括号,将其压入栈中。
  • 如果是一个右括号,尝试从栈中弹出一个左括号。若弹出失败(即栈为空),则需要插入一个左括号来匹配当前右括号。若弹出成功,则当前括号已经匹配成功,继续扫描下一个括号。

下面是实现这个过程的Python代码:

def min_insertions(s: str) -> int:
    stack = []  # 用列表模拟栈
    count = 0   # 记录需要插入的括号数量

    for c in s:
        if c == '(':
            stack.append(c)
        elif c == ')':
            if not stack:   # 栈为空,需要插入左括号
                count += 1
            else:           # 匹配成功,弹出左括号
                stack.pop()

    count += len(stack)  # 如果栈中还有左括号,需要插入右括号使其匹配

    return count

这里用Python中的列表来模拟栈。代码中的 if not stack 语句相当于判断栈是否为空,如果为空则为真。

示例

以下是测试代码:

assert min_insertions("(()") == 1
assert min_insertions("))()(") == 3
assert min_insertions("(((((())") == 4
assert min_insertions(")))))))") == 6

结论

本文介绍了一种使用栈来处理不平衡括号序列的方法,并给出了Python代码实现。这种方法的时间复杂度为 O(n),其中 n 是括号序列的长度。这种方法简单有效,适用于绝大多数情况。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程