📅  最后修改于: 2023-12-03 15:10:44.448000             🧑  作者: Mango
在编程中,平衡括号序列是一个常见的问题。给定一个只包含字符'('和')'的字符串,返回一个新的字符串,其中这些括号已经排列成平衡括号序列,即左右括号匹配且括号嵌套正确。本篇介绍如何查找字典顺序的下一个平衡括号序列。
对于一个平衡括号序列,我们可以给它下一个字典顺序更大的序列。例如,序列"(())()"的下一个序列为"()()()"。如果不存在这样的序列,则返回空字符串。
从右到左遍历序列,找到第一对相邻的左右括号,其中左括号在右括号左边。如果不存在这样的括号对,则说明序列已经是最大平衡括号序列,返回空字符串。否则,我们需要更改这个括号对,使其成为下一个字典顺序更大的括号对。
为了实现这一点,我们需要找到这个左括号右边的最小的字符,使其大于左括号,然后交换这两个字符。在此之后,我们需要将右侧括号后面的字符按照字典顺序排列,这样可以使得序列成为下一个字典顺序更大的平衡括号序列。
def next_balanced_sequence(s: str) -> str:
n = len(s)
if n < 2:
return ''
s = list(s)
i = n - 2
while i >= 0 and s[i] >= s[i+1]:
i -= 1
if i < 0:
return ''
j = i + 1
while j < n and s[j] > s[i]:
j += 1
j -= 1
s[i], s[j] = s[j], s[i]
s[i+1:] = sorted(s[i+1:])
return ''.join(s)
下面是几组测试样例:
assert next_balanced_sequence('') == '' # 空序列
assert next_balanced_sequence(')(') == '' # 不是平衡括号序列
assert next_balanced_sequence('()') == '' # 已经是最大平衡括号序列
assert next_balanced_sequence('())') == '))(' # 下一个平衡括号序列
assert next_balanced_sequence('()())()') == '(()))()' # 下一个平衡括号序列
通过上述的解题思路和代码实现,我们可以编写出一个可用的查找字典顺序的下一个平衡括号序列的算法,希望这篇文章对大家有所帮助。