返回
编码挑战:化繁为简——平衡字符串的最小交换次数
前端
2023-10-19 11:14:06
在编码的世界里,我们经常会遇到看似复杂但本质简单的挑战。LeetCode 上的这道经典题目就是一个完美的例子,它要求我们找到使一个字符串平衡所需的最小交换次数。不要被题目迷惑,因为它可以通过一种出人意料的简单方法解决,让我们踏上这趟编码之旅,揭开其中的奥秘。
理解问题:括号的平衡之舞
这道题目涉及括号匹配,它给出了一个包含括号的字符串,我们的任务是找到使该字符串平衡所需的最小交换次数。一个字符串被称为平衡的,当它满足以下条件:
- 对于每个左括号 '(',都存在一个匹配的右括号 ')'。
- 对于每个右括号 ')’,都存在一个匹配的左括号 '('。
破解难题:左括号计数法
解决这个问题的关键在于认识到:使一个字符串平衡所需的交换次数等于未匹配左括号的数量。当我们从左到右遍历字符串时,我们可以使用一个计数器 num 来跟踪未匹配的左括号。
- 遇到左括号 '(',num 加 1。
- 遇到右括号 ')’,num 减 1。
如果在遍历过程中遇到右括号后 num 变为负数,这意味着我们有未匹配的右括号,需要进行交换。在这种情况下,我们将交换次数加 1,并继续遍历。
代码实现:一步步走向平衡
def min_swaps(string):
# 初始化未匹配左括号计数器
num = 0
# 初始化交换次数
swaps = 0
# 从左到右遍历字符串
for char in string:
# 遇到左括号,计数器加 1
if char == '(':
num += 1
# 遇到右括号,计数器减 1
elif char == ')':
# 如果计数器为负数,需要交换
if num < 0:
swaps += 1
# 否则,计数器正常减 1
else:
num -= 1
# 返回交换次数
return swaps
用例探索:从不平衡到完美平衡
让我们通过一些用例来展示算法的实际应用:
- 输入:字符串 "()(()",输出:2(需要交换两个右括号)
- 输入:字符串 "())",输出:1(需要交换一个右括号)
- 输入:字符串 "((()",输出:3(需要交换三个右括号)
- 输入:字符串 "()",输出:0(字符串已平衡)
结语:简洁与优雅并存
LeetCode 上的这道题目证明了编码的魅力——看似复杂的挑战可以用出人意料的简单方法解决。通过跟踪未匹配左括号的数量,我们可以高效地找到使字符串平衡所需的最小交换次数。这不仅是一种有效的算法,更展示了编程中简洁与优雅并存的力量。