此代码如何检查平衡括号

How does this code to check for balanced parenthesis work?

本文关键字:平衡 检查 代码 何检查      更新时间:2023-10-16

这是我正在处理的问题:http://usaco.org/index.php?page=viewproblem2&cpid=188

解决方案如下:http://usaco.org/current/data/sol_typo.html

我无法理解解决方案背后的逻辑。任何人都可以详细解释解决方案吗?

我是解决这些问题的新手,但我正在努力为11月的第一次USACO比赛做准备。只是为了澄清起见,我正在用C++编写解决方案。

要使字符串具有平衡括号,您需要两件事:相同数量的(),并且每个(都可以与右侧的至少一个)匹配。

另一种看待它的方法是将(视为+1,将)视为-1。一次处理一个括号时,根据其符号,从 0 开始添加或减去 1。如果总和降至 0 以下(这只有在您击中 ) 时才会发生),您知道如果可以反转一个括号来平衡字符串,它将是那个。达到此点后,将总和重置为零。如果总和再次降至零以下,它将永远无法平衡,因此您可以提前退出。

您需要处理的另一种情况是将(切换到)将平衡字符串。仅当末尾的总和为 2 时,您才能执行此操作,因此您可以跟踪在总和为>=2 时看到的最后(。如果总和<2,则无法切换该(

如果末尾的总和小于零,则字符串将不平衡。如果末尾的总和为零,那么如果你找到一个要反转的括号,那就是要反转的括号。否则,如果它是2,您可以交换您找到的最后一个(来平衡字符串。