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

问题:

输出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




以下是Python代码实现: ```python from itertools import product def reflexive_relations(A): """ 计算集合A上的所有自反关系 """ n = len(A) reflexive = [] for subset in product([0, 1], repeat=n): if all(subset[i] for i in range(n) if A[i] in A): reflexive.append(set((A[i], A[j]) for i, j in product(range(n), repeat=2) if subset[i] and i == j)) return reflexive def symmetric_relations(A): """ 计算集合A上的所有对称关系 """ n = len(A) symmetric = [] for subset in product([0, 1], repeat=n*(n-1)//2): if all(subset[i] == subset[j] for i, j in product(range(n*(n-1)//2), repeat=2) if i != j and ((i//n, i%n) != (j//n, j%n))): matrix = [[None] * n for _ in range(n)] for i, j in product(range(n), repeat=2): if j > i: matrix[i][j] = subset.pop(0) elif i == j: matrix[i][j] = 1 else: matrix[i][j] = matrix[j][i] if all(matrix[i][j] == matrix[j][i] for i, j in product(range(n), repeat=2)): symmetric.append(set((A[i], A[j]) for i, j in product(range(n), repeat=2) if matrix[i][j])) return symmetric n = int(input()) A = input()[1:-1].split(',') A.sort() reflexive = reflexive_relations(A) symmetric = symmetric_relations(A) print('zifan:', end=' ') if not reflexive: print('{}') else: for r in reflexive: print('{', end='') print(','.join('<{},{}>'.format(x[0], x[1]) for x in r), end='') print('}', end=' ') print() print('duichen:', end=' ') if not symmetric: print('{}') else: for s in symmetric: print('{', end='') print(','.join('<{},{}>'.format(x[0], x[1]) for x in s), end='') print('}', end=' ') print() ``` 实现思路: - 对于自反关系,我们可以枚举所有元素是否与自身有关系,将符合条件的元素组合成关系; - 对于对称关系,我们可以使用01矩阵表示关系,并且只需要枚举上三角部分的元素是否相同,然后填充成矩阵,最后判断是否满足对称性。 注意事项: - 集合中可能有重复的元素,因此需要先对集合进行排序,保证输出顺序; - 集合中可能存在不在集合中的元素,这些元素与自身一定有关系,因此在枚举自反关系时需要特殊处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值