题目:小明一组括号序列,只有所有的括号都可以形成闭合的。如何x合法,则XY也合法,X(Y)也合法。比如() ; ()()(), (()()),(((())))都是合法括号。现在小明移动括号,第一次移出最左侧的左括号,第二次移出右括号,使得剩余序列为合法序列,如此重复,直到序列为口,请问有多少种移动方法。移动右侧不同的位置就是不同的方法。
输入:括号序列
输出:多少种移动方法
测试用例:
输入:(((())))
移动的方法为4*3*2*1
输出:24
思路: 序列的方法可以理解成一种组合,可以看做将去除一个左括号,对应的可以去除右括号的类数之积(即与这个左括号距离最近的右括号,和距离最远的右括号之差(中间隔有右括号最近的左括号)),该题目中的合法序列都是对称的,所以可以等价于遇到右括号前面对应的左括号数。(大家自己体会。很少写博客,可能表达的不是很清楚)
#!/bin/python# -*- coding:UTF-8 -*- kstring = raw_input() """方法一:暴力遍历,方法二,挨着累计‘(‘的个数,遇到‘)‘就完成一次匹配,把情况数乘进答案。本质是把题目所说的移除操作做了一个等价的变化。""" ans = 1cnt = 0for i in range(len(kstring)): if kstring[i] == ‘(‘: cnt += 1 else: ans *= cnt cnt -= 1print ans
时间: 2024-09-29 05:20:29