括号匹配方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了括号匹配方案相关的知识,希望对你有一定的参考价值。

题目:小明一组括号序列,只有所有的括号都可以形成闭合的。如何x合法,则XY也合法,X(Y)也合法。比如() ; ()()(), (()()),(((())))都是合法括号。现在小明移动括号,第一次移出最左侧的左括号,第二次移出右括号,使得剩余序列为合法序列,如此重复,直到序列为口,请问有多少种移动方法。移动右侧不同的位置就是不同的方法。

输入:括号序列

输出:多少种移动方法

测试用例:

  输入:(((())))

  移动的方法为4*3*2*1

  输出:24

思路: 序列的方法可以理解成一种组合,可以看做将去除一个左括号,对应的可以去除右括号的类数之积(即与这个左括号距离最近的右括号,和距离最远的右括号之差(中间隔有右括号最近的左括号)),该题目中的合法序列都是对称的,所以可以等价于遇到右括号前面对应的左括号数。(大家自己体会。很少写博客,可能表达的不是很清楚)

#!/bin/python
# -*- coding:UTF-8 -*-

kstring = raw_input()

"""方法一:暴力遍历,方法二,挨着累计‘(‘的个数,遇到‘)‘就完成一次匹配,把情况数乘进答案。本质是把题目所说的移除操作做了一个等价的变化。"""

ans = 1
cnt = 0
for i in range(len(kstring)):
if kstring[i] == ‘(‘:
cnt += 1
else:
ans *= cnt
cnt -= 1
print ans

以上是关于括号匹配方案的主要内容,如果未能解决你的问题,请参考以下文章

22. Generate Parentheses产生所有匹配括号的方案

使用正则表达式在嵌套括号外查找匹配项

vscode如何更改括号匹配后的颜色?

易语言中的‘括号符不匹配’如何解决

括号匹配算法

括号匹配(栈)