返回

编码挑战:化繁为简——平衡字符串的最小交换次数

前端

在编码的世界里,我们经常会遇到看似复杂但本质简单的挑战。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 上的这道题目证明了编码的魅力——看似复杂的挑战可以用出人意料的简单方法解决。通过跟踪未匹配左括号的数量,我们可以高效地找到使字符串平衡所需的最小交换次数。这不仅是一种有效的算法,更展示了编程中简洁与优雅并存的力量。