码迷,mamicode.com
首页 > 其他好文 > 详细

括号匹配方案

时间:2017-09-10 13:37:41      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:间隔   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!