标签:间隔 ring 去除 等价 方法 个数 移动 自己 输入
题目:小明一组括号序列,只有所有的括号都可以形成闭合的。如何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
标签:间隔 ring 去除 等价 方法 个数 移动 自己 输入
原文地址:http://www.cnblogs.com/xuxl-face2018/p/7500640.html