返回
栈解题 | 优雅解析LeetCode 1190:反转每对括号间的子串
后端
2023-12-14 16:21:06
算法思想与步骤
-
初始化栈:
- 创建一个空栈,将其命名为
stack
。
- 创建一个空栈,将其命名为
-
遍历字符串:
- 从左向右逐一遍历字符串中的每个字符
ch
。
- 从左向右逐一遍历字符串中的每个字符
-
识别括号:
- 如果
ch
是左括号(
, 将其压入栈中,同时将当前遍历的字符索引i
作为该左括号的索引值。
- 如果
-
反转括号内的子串:
- 当
ch
是右括号)
时,说明当前已找到一对括号。 - 弹出栈顶的左括号索引
start_index
,计算左括号与当前右括号之间的子串substring
。 - 将
substring
反转,并将其重新插入到字符串中,从start_index
开始到i
结束。
- 当
-
继续遍历字符串:
- 重复步骤2-4,直到遍历完整个字符串。
-
返回结果:
- 将最终反转后的字符串返回。
代码实现
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号问题——反转每对括号间的子串。通过对栈的基本原理和题目的深入分析,我们一步步拆解了问题的本质,并最终得到了清晰简洁的解决方案。希望这篇文章能帮助你更好地理解栈的使用,并提升你的算法思维和编程能力。