您的位置:首页 > 其它

输出n对括号的所有有效排列组合

2014-07-30 18:26 691 查看

问题:

输出n对括号所有有效的排列组合。比如三对括号,其有效的排列组合方式总共有5种:()()(),((())),(())(),()(()),(()())。

解决思路:

将一对括号编码为01,即左括号为0,右括号为1,那么n对括号的所有排列组合(不一定有效)就是n个0和n个1的全排列,全排列算法相对容易实现。假如我们已经得到了所有的全排列,那么接下来就是排除全排列中排列无效的形式。排除的方式也简单:从头遍历,遇到01挨着的就删除掉,直到整个字符串为空(有效),或不存在01组合(无效)。

代码:

全排列

def permutation(lst,beg):
if beg>=len(lst):
yield "".join([str(x) for x in lst])
return

for index in range(beg,len(lst)):
lst[index],lst[beg]=lst[beg],lst[index]
for val in permutation(lst,beg+1):
yield val
lst[index],lst[beg]=lst[beg],lst[index]
注:使用生成器是为了方便记录排列结果,
另:此时得到的全排列有重复的,可通过set来去重({}.fromkeys(lst).keys())

排列有效性检查

def chkstr(args):
if len(args)==0:
return True

tmp=list(args)
index=1
while index < len(tmp):
pre=tmp[index-1]
pst=tmp[index]
if pre=='0' and pst=='1':
tmp[index-1]='-1'
tmp[index]='-1'
index=index+2
else:
index=index+1

args="".join(tmp)

if args.count('-1')==0:
return False
else:
return chkstr(args.replace('-1', ''))


最后:

if __name__ == '__main__':
lst=[]
for val in permutation([0,0,0,1,1,1],0):
t=chkstr(val)
if t:
lst.append(val)
rst={}.fromkeys(lst).keys()
for val in rst:
print val


def brackets(left, right, bks):
if left > right:
return

if right == 0:
yield bks

if 0 < left <= right:
for val in brackets(left-1, right, bks+"("):
yield val

if right > max(left, 0):
for val in brackets(left, right-1, bks+")"):
yield val
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: