返回

栈解题 | 优雅解析LeetCode 1190:反转每对括号间的子串

后端

算法思想与步骤

  1. 初始化栈:

    • 创建一个空栈,将其命名为stack
  2. 遍历字符串:

    • 从左向右逐一遍历字符串中的每个字符ch
  3. 识别括号:

    • 如果ch是左括号(, 将其压入栈中,同时将当前遍历的字符索引i作为该左括号的索引值。
  4. 反转括号内的子串:

    • ch是右括号)时,说明当前已找到一对括号。
    • 弹出栈顶的左括号索引start_index,计算左括号与当前右括号之间的子串substring
    • substring反转,并将其重新插入到字符串中,从start_index开始到i结束。
  5. 继续遍历字符串:

    • 重复步骤2-4,直到遍历完整个字符串。
  6. 返回结果:

    • 将最终反转后的字符串返回。

代码实现

def reverse_parentheses(s):
  """
  反转字符串中的每个括号内的子串。

  参数:
    s: 输入字符串。

  返回:
    反转括号内的子串后的字符串。
  """

  stack = []  # 存储左括号的索引

  # 遍历字符串
  for i, ch in enumerate(s):
    # 左括号
    if ch == '(':
      stack.append(i)
    # 右括号
    elif ch == ')':
      # 弹出栈顶的左括号索引
      start_index = stack.pop()

      # 获取括号内的子串
      substring = s[start_index+1:i]

      # 反转子串
      reversed_substring = substring[::-1]

      # 将反转后的子串插入字符串中
      s = s[:start_index] + reversed_substring + s[i+1:]

  return s


# 测试代码
input_string = "(abcd)ef(ghi)j(klm)"
result = reverse_parentheses(input_string)
print(result)  # 输出:"efjgkla(dcba)m"

结语

在本文中,我们深入探讨了如何运用栈来优雅地解决LeetCode上的第1190号问题——反转每对括号间的子串。通过对栈的基本原理和题目的深入分析,我们一步步拆解了问题的本质,并最终得到了清晰简洁的解决方案。希望这篇文章能帮助你更好地理解栈的使用,并提升你的算法思维和编程能力。