最小的方括号反转数?

时间:2019-07-18 04:45:48

标签: python stack brackets

给出一个仅包含“}”和“ {”的表达式。表达式可能不平衡。找到最小的方括号反转次数以使表达式平衡

…。蟒蛇 ``     a = ['} {} {} {}}} {{{{{{} {} {}}} {{} {} {}} {{}} {{']

for elem in a:
    sol=0
    stack=[]
 #stack.append(elem[i])
    i=0
    while i<len(elem)-1:
        if elem[i]=='{' and elem[i+1]=='{':
            stack.append(elem[i])
            stack.append(elem[i+1])
            sol+=1
        elif elem[i]=='}' and elem[i+1]=='{':
            if len(stack)!=0:
                if stack[-1]=='{':
                    stack.pop()
                    stack.append(elem[i+1])

                else:
                    stack.append(elem[i])
                    stack.append(elem[i+1])
                    sol+=1
            else:  
                stack.append(elem[i])
            ``  stack.append(elem[i+1])
                sol+=2
        elif elem[i]=='}' and elem[i+1]=='}':
            if len(stack)!=0:
                if stack[-1]=='{' and stack[-2]=='{':
                    stack.pop()
                    stack.pop()
                    sol-=1
                elif stack[-1]=='{' and stack[-2]=='}':
                    stack.pop()
                    stack.append(elem[i+1])
                else:
                    stack.append(elem[i])
                    stack.append(elem[i+1])
                    sol+=1
            else:
                stack.append(elem[i])
                stack.append(elem[i+1])
                sol+=1
        i+=2
    print(sol)

....

预期5 输出6

2 个答案:

答案 0 :(得分:1)

我已经尝试过根据括号的打开次数和字符串表达式所需的取反来解决您的问题,以计算括号反转的最小次数。

相同的Python代码如下:

def cal_rev(exp):
    if len(exp) % 2:
        return -1
    open = 0
    invert = 0
    for i in exp:
        if i == '{':
            open += 1
        else:
            if open:
                open -= 1
            else:
                open = 1
                invert += 1
    print(invert + open/2)


if __name__ == '__main__':
    expr = "}{}{}{}}}{{{{{}{}{}}{{}{}{}}{{}}{{"
    cal_rev(expr)

答案 1 :(得分:0)

您可以使用此link找到问题的答案。该链接与c,java和python代码一起提供了解决上述问题的不同方法。

链接中使用的最佳方法很简单,它涉及以下步骤。

  1. 在第一次遍历时删除字符串的平衡部分,并仅将不平衡部分保留在堆栈中。

  2. 然后,只剩下堆栈中类型为}}} ...} {... {{{}的字符串。

  3. 让}的计数为m,{的计数为n。

  4. 最小冲销数量为ceil(m / 2)+ ceil(n / 2)。

Python代码如下:

$ fx set core.x64

时间复杂度:O(n)

享受!