【问题标题】:Minimum no of bracket reversals?括号反转的最小数量?
【发布时间】:2019-11-26 23:05:05
【问题描述】:

给定一个只有“}”和“{”的表达式。表达可能不平衡。找到使表达式平衡的最小括号反转次数

…。 Python `` 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

【问题讨论】:

  • 如果您需要方法,请查看我的回答和回复。
  • 非常感谢阿达什

标签: python stack brackets


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

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

    2. 那么您的堆栈中只剩下 }}}...}{...{{{ 类型的字符串。

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

    4. 最小反转次数为 ceil(m/2) + ceil(n/2)。

    Python 代码如下:

    def countMinReversals(expr):  
    
        lenn = len(expr)  
    
        # length of expression must be even  
        # to make it balanced by using reversals.  
        if (lenn % 2) : 
            return -1
    
        # After this loop, stack contains  
        # unbalanced part of expression,   
        # i.e., expression of the form "...."  
        s = []  
        for i in range(lenn): 
            if (expr[i] =='' and len(s)):  
    
                if (s[0] == '') : 
                    s.pop(0)  
                else: 
                    s.insert(0, expr[i])  
            else: 
                s.insert(0, expr[i])  
    
        # Length of the reduced expression  
        # red_len = (m+n)  
        red_len = len(s)  
    
        # count opening brackets at the  
        # end of stack  
        n = 0
        while (len(s)and s[0] == '') : 
                s.pop(0)  
                n += 1
    
        # return ceil(m/2) + ceil(n/2) which 
        # is actually equal to (m+n)/2 + n%2  
        # when m+n is even.  
        return (red_len // 2 + n % 2) 
    

    时间复杂度:O(n)

    享受吧!

    【讨论】:

    • 你能解释一下# return ceil(m/2) + ceil(n/2)背后的逻辑是什么
    • 首先,需要有偶数个括号。如果括号的数量不是偶数,它们就不能平衡。删除平衡部分后,我们剩下 }}}....}}}{{{..{{{ 这部分。这部分的长度也将是均匀的。所以 m 和 n 都是偶数或都是奇数。如果 m 和 n 都是偶数,那么答案是 m/2 + n/2。但如果 m 和 n 都是奇数(例如 }}}}}{{{ m = 5 和 n = 3),则所需的最小反转将是 ceil(5/2) + ceil(3/2) = 3 +2 = 5。即 {{}}{}{}。为了平衡中间 }{,我们使用 ceil @NeerajJain
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2020-05-10
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多