输出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
相关文章推荐
- 输出n对括号的所有有效(左右括号成对匹配)排列
- 输出n对括号的所有有效(左右括号成对匹配)排列
- 针对如"123456"之类的任意字符序列,输出它们所有的排列组合
- 输出4个整数(不重复)的所有排列组合
- 面试题:输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- 输出字符串的所有排列组合
- 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- JAVA 输出指定字符串所有排列组合
- 输出所有括号组合
- 编程题:输出字符集合的所有排列组合。
- 【卡特兰数】有N对括号,输出所有合法的组合
- 任意数字序列“123456”之类,输出它们所有的排列组合
- 输出n对括号所有有效的匹配 java实现
- 输出所有排列组合
- 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)
- Swift - 排列组合之全排列 (输入一个字符串,输出该字符串包含的字符的所有组合)
- 输入N个数,输出所有可能的排列组合(6+个小时啊,耶稣~)
- 输出1,2,2,3,4,5的所有排列组合,4不能在第3位,3和5不能相邻
- 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻
- 输出所有的合法的括号组合