首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找带递归的括号python的所有组合

查找带递归的括号python的所有组合
EN

Stack Overflow用户
提问于 2022-04-28 09:53:58
回答 1查看 125关注 0票数 0

因此,我正在编写一个函数,它返回所有合法括号的字符串列表,其中打开和关闭了n对括号。括号类型在对列表中以字符串的形式给出。

例如:如果对是list ["()“、”[]“),则函数必须返回所有有效的2n字符表达式,其中包含方括号和圆括号。

注意:如果所有打开的括号也都已关闭(带有适当的括号),并且括号嵌套正确,则括号表达式是有效的。"“是有效表达式,而"()”不是有效表达式。

例如:输入:

代码语言:javascript
复制
print(all_paren(2, ["()","{}"]))

应返回以下列表:

代码语言:javascript
复制
['(())', '()()', '(){}', '({})', '{()}', '{{}}', '{}()', '{}{}']

我的代码没有成功:

代码语言:javascript
复制
def all_paren(n, pairs):
    lst = []
    for i in range(len(pairs)):
        lst1 = []
        generateParentheses(0,0,n,pairs[i][0],pairs[i][1],lst1)
        lst.extend(lst1)
    return lst

def generateParentheses(openBr, closeBr, n, left_bracket, right_bracket,lst,s=[]):
    if closeBr == n:
        lst.append(''.join(s))
        return 

    if closeBr < openBr:
        s.append(right_bracket)
        generateParentheses(openBr, closeBr+1, n,left_bracket,right_bracket,lst,s)
        s.pop()
    if openBr < n:
        s.append(left_bracket)
        generateParentheses(openBr+1, closeBr, n,left_bracket,right_bracket,lst,s)
        s.pop()
    return

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 11:02:44

使用permutations方法通过itertools构建python

open_closeclose_open是字典,open_close映射为闭括号,close_open maps尾括号为开括号。

all_perm()为所提供的括号生成所有排列。

is_val_paren接受一个string并检查括号组合是否有效。

代码语言:javascript
复制
import itertools

open_close = dict(
        {'(':')',
            '[':']',
            '{':'}',
            '<':'>'
            }
        )
close_open = dict(
        {')':'(',
            ']':'[',
            '}':'{',
            '>':'<'
            }
        )

def all_perm(n, values):
    valid_parens = []

    for parens in itertools.product(values, repeat = n):
        val = list()
        for v in parens:
            val.extend(v)
        #print(f"{val}")
        for perm in itertools.permutations(range(n*2)):
            brakets = [None]*(n*2)
            for index, p in enumerate(perm):
                brakets[index] = val[p] 
            #print(f"{perm=} {brakets=}")
            if is_val_paren(brakets):
                valid_parens.append(''.join(brakets))
    return set(valid_parens)

def is_val_paren(brakets:list):
    stack = list()
    for braket in brakets:
        if braket in open_close.keys():
            stack.append(braket)
        else:
            if len(stack) == 0:
                return False
            elif stack[-1] == close_open[braket]:
                stack.pop()
            else:
                return False
    return len(stack) == 0 

print(all_perm(n = 2, values = ["()", "[]"]))
print()
print(all_perm(n = 1, values = ["()", "[]"]))
print()
print(all_perm(n = 3, values = ["()", "[]", "{}"]))

产出:

代码语言:javascript
复制
{'[()]', '()[]', '([])', '[]()', '[[]]', '()()', '[][]', '(())'}

{'[]', '()'}

{'([{}])', '{[]}()', '{[][]}', '{}[]{}', '[({})]', '[]{()}', '(())[]', '{({})}', '[()()]', '[][{}]', '()[{}]', '[()[]]', '[]()[]', '()[()]', '()(())', '()({})', '(([]))', '[(())]', '[([])]', '[{}][]', '(){}{}', '{[]()}', '{{{}}}', '({}[])', '({}){}', '([()])', '{}(){}', '{()()}', '[{{}}]', '[{}{}]', '[(){}]', '(){[]}', '()()[]', '{{}()}', '(){}()', '{}[{}]', '[](){}', '({{}})', '(()){}', '[][][]', '()[]{}', '({})[]', '{}{[]}', '{}[][]', '([]())', '{}[[]]', '[]{{}}', '({()})', '[]([])', '()()()', '[[()]]', '[[]()]', '[](())', '{}{{}}', '{[]{}}', '{}{}[]', '{{}}{}', '()[][]', '([])()', '[()][]', '[{}]{}', '{[[]]}', '([]){}', '{}[()]', '()[[]]', '[{}]()', '{[]}{}', '{{}[]}', '()[]()', '{}{}()', '{(){}}', '({[]})', '{{}{}}', '{()}{}', '[[]]()', '((){})', '[{}[]]', '[()]{}', '[]{}{}', '{{()}}', '([][])', '(()[])', '()([])', '{(())}', '[[]][]', '([]{})', '(())()', '([[]])', '[]{}[]', '[[[]]]', '(){}[]', '[[][]]', '[{}()]', '[][]()', '[[]]{}', '{}(())', '{}({})', '{[()]}', '[()]()', '(){()}', '{}([])', '(){{}}', '[]{}()', '{}()()', '[]()()', '([])[]', '{()}()', '{}{()}', '(({}))', '[[]{}]', '[][()]', '{}[]()', '({}{})', '((()))', '({})()', '{()}[]', '[[{}]]', '()(){}', '[][[]]', '{{}}()', '[{()}]', '{([])}', '[][]{}', '{{}}[]', '({}())', '[{[]}]', '{[{}]}', '{()[]}', '(()())', '{{[]}}', '[]{[]}', '{}()[]', '{}{}{}', '[]({})', '{[]}[]'}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72041611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档