可以递归地定义纠正胃肠炎的序列:
给出两个字符串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 == []
答案 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 ;.因此,我的答案是每个有效的括号字符串只有一个排列,但这显然是错误的。
你或其他任何人可以扩展这个吗?