这段代码如何检查平衡括号工作?

时间:2014-04-03 03:18:55

标签: c++ algorithm

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

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

我无法理解解决方案背后的逻辑。谁能请详细解释解决方案?

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

1 个答案:

答案 0 :(得分:1)

对于具有平衡括号的字符串,您需要两件事:()的数量相等,每个(可以与至少一个{{1}匹配在它的右边。

另一种看待它的方法是将)视为(,将+1视为)。当您一次处理一个括号时,根据其符号加1或减1,从0开始。如果总和低于0(只有当你点击-1时才会发生,你知道如果你可以反转一个括号以平衡字符串,它将是那个。一旦你达到这一点,你将总和重置为零。如果总和再次低于零,它将永远不会平衡,所以你可以早进行。

您需要处理的另一种情况是将)切换为(将平衡字符串。只有当末尾的总和为2时,您才能执行此操作,因此您可以跟踪上次),而总和为> = 2。如果总和是< 2,你无法切换(

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