擅长:python、mysql、java
<p>这是一个潜在的解决方案。Free包含一个索引每个点的列表,pairs包含一个元组的列表,这些元组包含每个对的索引。这是在假设您的数据是完美的(也就是说,左对和右对的数量相同,在左对之前没有右对)然而,可以修改它来检查边缘情况。根据你的问题,我从1开始索引,而不是0。在</p>
<pre><code>data = '(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....'
left = []
group = []
prev = ''
free = []
pairs = []
for index, elem in enumerate(data, 1):
if elem == '.' and prev == '.':
group.append(index)
elif elem == '.':
group = [index]
else:
if len(group) >= 1:
free.append(group)
group = []
if elem == '(':
left.append(index)
elif elem == ')':
pairs.append([left.pop(), index])
prev = elem
if len(group) > 0:
free.append(group)
pairs.sort()
</code></pre>
<p>输出:</p>
^{pr2}$
<p>代码通过在每个元素上迭代一次来工作。如果遇到左括号,则将索引追加到列表中。当它遇到一个右paren时,它从最后一个看到的左paren的索引中弹出,创建一个对。至于自由点,跟踪前面的元素会告诉您如何处理每个点。如果已经看到一个,继续添加到当前列表,否则启动一个新列表。在</p>