返回

反转括号,柳暗花明!

前端

破解 leetcode-1190 谜题:利用栈反转括号间字符串

简介

leetcode-1190 是一道经典的字符串处理题目,要求反转给定字符串中所有括号内的子串。乍一看,这似乎是一项艰巨的任务,需要复杂的算法和繁琐的逻辑。然而,通过深入思考,你会发现一个巧妙的解决方案,它利用了栈这一强大的数据结构。

栈的妙用

栈是一种先进后出的数据结构,非常适合解决 leetcode-1190 问题。它的工作原理很简单:你可以将元素压入栈中,也可以从栈中弹出元素。栈顶总是指向栈中最后一个压入的元素。

利用栈,我们可以巧妙地反转括号内的子串:

  1. 初始化一个栈: 这个栈将存储尚未处理的左括号。
  2. 遍历字符串: 逐个处理字符串中的字符。
  3. 遇到左括号: 将左括号压入栈中。
  4. 遇到右括号: 从栈中弹出与之匹配的左括号,并反转这两个括号之间的子串。
  5. 遇到其他字符: 直接添加到结果字符串中。
  6. 遍历结束: 如果栈中还有未处理的左括号,则将它们反转并添加到结果字符串中。

代码实现

def reverse_parentheses(s):
    stack = []
    result = []

    for char in s:
        if char == '(':
            stack.append(len(result))
        elif char == ')':
            left = stack.pop()
            result[left:len(result)] = reversed(result[left:len(result)])
        else:
            result.append(char)

    return ''.join(result)

案例分析

为了更好地理解算法,让我们以 "a(bc)de(fg)" 为例进行分析:

  1. 初始化: 栈和结果字符串均为空。
  2. 遍历字符串:
    • "a": 加入结果字符串。
    • "(": 压入栈中。
    • "b": 加入结果字符串。
    • "c": 加入结果字符串。
    • ")": 弹出栈中左括号,反转 "bc" 为 "cb",更新结果字符串为 "a" + "cb"。
    • "d": 加入结果字符串。
    • "e": 加入结果字符串。
    • "(": 压入栈中。
    • "f": 加入结果字符串。
    • "g": 加入结果字符串。
    • ")": 弹出栈中左括号,反转 "fg" 为 "gf",更新结果字符串为 "a" + "cb" + "d" + "e" + "gf"。
  3. 遍历结束: 栈中无左括号。

最终,结果字符串为 "agfedcb"。

总结

通过巧妙地利用栈,我们能够优雅地解决 leetcode-1190 难题。掌握栈数据结构和字符串处理技巧至关重要,它将使我们在算法世界中更加游刃有余。

常见问题解答

  1. 为什么使用栈?
    栈可以跟踪尚未处理的左括号,从而实现括号匹配和子串反转。

  2. 如果栈中还有未处理的左括号怎么办?
    遍历结束后,如果栈中还有未处理的左括号,我们将它们反转并添加到结果字符串中。

  3. 算法的时间复杂度是多少?
    算法的时间复杂度为 O(n),其中 n 是字符串的长度。

  4. 算法的空间复杂度是多少?
    算法的空间复杂度为 O(n),因为我们需要一个栈来存储左括号。

  5. 除了栈,还有其他解决方法吗?
    可以考虑使用递归或双指针的方法,但栈是最直观、最简洁的方法。