更正括号的序列

时间:2017-07-26 02:04:17

标签: algorithm python-2.7

可以递归地定义纠正胃肠炎的序列:

  • 空字符串""是一个正确的序列。
  • 如果" X"和" Y"是正确的序列,然后" XY" (串联的 X和Y)是正确的序列。
  • 如果" X"是一个正确的序列,然后"(X)"是一个正确的序列。
  • 可以使用上述导出每个正确的括号序列 规则。

给出两个字符串s1和s2。这些字符串中的每个字符都是括号,但字符串本身不一定是正确的括号序列。 您希望交错两个序列,以便它们形成正确的括号序列。注意,有时交错两个序列的两种不同方式将产生相同的最终字符序列。即使发生这种情况,我们也会分别计算每种方式。

计算并返回产生正确括号序列的不同方式的数量,模数为10 ^ 9 + 7.

示例s1 =(()和s2 =())

corrects sequences of parentheses, s1 (red) and s2(blue)

我不理解递归算法,X和Y是什么意思?并模数10 ^ 9 + 7?

首先,我尝试定义s1和s2的所有排列,然后计算平衡括号的数量。但这种方式是错误的,不是吗?

class InterleavingParenthesis:
    def countWays(self, s1, s2):
        sequences = list(self.__exchange(list(s1 + s2)))
        corrects = 0

        for sequence in sequences:
            if self.__isCorrect(sequence):
                corrects += 1

    def __isCorrect(self, sequence):
        s = Stack()
        balanced = True
        i = 0

        while i < len(sequence) and balanced:
            if '(' == sequence[i]:
                s.stack(sequence[i])

            elif s.isEmpty():
                balanced = False

            else: s.remove()

            i += 1

        if s.isEmpty() and balanced: return True

        else: return False 

        def __exchange(self, s):
            if len(s) <= 0: yield s

            else:
                for i in range(len(s)):
                    for p in self.__exchange(s[:i] + s[i + 1:]):
                        yield [s[i]] + p

class Stack:
    def __init__(self):
        self.items = []

    def stack(self, data):
        self.items.append(data)

    def remove(self):
        self.items.pop()

    def isEmpty(self):
        return self.items == []

1 个答案:

答案 0 :(得分:0)

这是一个显示此递归属性如何工作的示例:

开始于:

X = "()()(())"

通过属性2 ,我们将其分解为X和Y:

X = "()" ; Y = "()(())"

对于X,我们可以使用属性3 查看内部。

X = ""

由于属性1 ,我们知道有效。 对于Y,我们再次使用属性2

X = "()"
Y = "(())"

使用与之前相同的递归(属性2 ,然后属性1 ),我们知道X有效。请注意,在代码中,您通常必须经历相同的过程,我只是为人类节省时间。对于Y,您使用属性3

X = "()"

再次......:

X = ""

使用属性1 ,您知道有效

因为&#34;()()(())&#34;的所有子部分;是有效的,&#34;()()(())&#34;是有效。这是递归的一个例子:你可以将问题分解为更小的问题,直到它们可以解决。在代码中,对于它的一小部分,你可以调用函数本身,在你的情况下, X和Y

至于你提出的问题,有一点对我没有意义。我不知道在任何括号中都有任何疑问,例如你链接的图像。在&#34;((()())())&#34;例如,这两个括号无法与匹配:&#34;(()()()) &#34 ;.因此,我的答案是每个有效的括号字符串只有一个排列,但这显然是错误的。

你或其他任何人可以扩展这个吗?