处理嵌套括号字符反转时出现IndexError,请求排查解决
括号内字符反转并移除括号的代码错误排查
题目背景与要求
朋友给Alexey发了一条加密消息,需将消息中括号()内的字符反转后删除括号,输入字符串括号格式合法且支持嵌套。
- 输入:含成对括号的字符串,长度
0<x≤50 - 输出:括号内字符反转且移除括号后的字符串
示例:
- 输入:
asd(asd)→ 输出:asddsa - 输入:
foo(bar)asd(asd)→ 输出:foorabasddsa - 输入:
fit((tif))→ 输出:fittif
我的实现代码
def reverse_inside_brackets(s): if not s: return s if s[0] == '(': i = 1 count = 1 while count > 0: if s[i] == '(': count += 1 elif s[i] == ')': count -= 1 i += 1 inside = s[1:i] reversed_inside = reverse_inside_brackets(inside) return s[0] + reversed_inside + s[i] else: return s[0] + reverse_inside_brackets(s[1:]) l = input() print(reverse_inside_brackets(l))
错误信息
IndexError Traceback (most recent call last) Cell In[17], line 2 1 l = input() ----> 2 print(reverse_inside_brackets(l)) Cell In[16], line 19, in reverse_inside_brackets(s) 17 return s[0] + reversed_inside + s[i] 18 else: ---> 19 return s[0] + reverse_inside_brackets(s[1:]) Cell In[16], line 19, in reverse_inside_brackets(s) 17 return s[0] + reversed_inside + s[i] 18 else: ---> 19 return s[0] + reverse_inside_brackets(s[1:]) Cell In[16], line 19, in reverse_inside_brackets(s) 17 return s[0] + reversed_inside + s[i] 18 else: ---> 19 return s[0] + reverse_inside_brackets(s[1:]) Cell In[16], line 17, in reverse_inside_brackets(s) 15 inside = s[1:i] 16 reversed_inside = reverse_inside_brackets(inside) ---> 17 return s[0] + reversed_inside + s[i] 18 else: 19 return s[0] + reverse_inside_brackets(s[1:]) IndexError: string index out of range
问题分析与解决
错误原因
- 索引越界:循环中找到闭合括号后,
i会自增到闭合括号的下一个位置,此时s[i]超出字符串的索引范围(例如输入(asd),字符串长度为5,索引最大为4,但i最终为5,访问s[5]就会报错)。 - 逻辑不符合需求:
- 代码保留了原括号(返回
s[0]左括号和s[i]相关内容),但题目要求删除括号。 - 未对括号内处理后的内容执行反转操作,不符合“括号内字符反转”的要求。
- 代码保留了原括号(返回
修正方案
- 找到闭合括号的准确位置:循环结束后,
i-1就是闭合括号的索引,括号内的内容为s[1:i-1]。 - 对括号内递归处理后的结果进行反转,然后拼接后续未处理字符串的递归结果,不再保留原括号。
- 非括号字符直接保留,递归处理剩余内容。
修正后的代码
def reverse_inside_brackets(s): if not s: return s if s[0] == '(': i = 1 count = 1 while count > 0: if s[i] == '(': count += 1 elif s[i] == ')': count -= 1 i += 1 # 处理括号内的内容,然后反转 processed_inside = reverse_inside_brackets(s[1:i-1]) reversed_inside = processed_inside[::-1] # 拼接反转后的内容和后续处理结果,不保留括号 return reversed_inside + reverse_inside_brackets(s[i:]) else: # 非括号字符直接保留,处理剩余部分 return s[0] + reverse_inside_brackets(s[1:]) l = input() print(reverse_inside_brackets(l))
验证示例
- 输入
asd(asd):处理括号内asd→反转成dsa,拼接后得到asddsa,符合预期。 - 输入
fit((tif)):先处理内层(tif)→反转成fit,外层括号内内容为fit→反转成tif,最终得到fittif,符合预期。
内容的提问来源于stack exchange,提问作者Gando4lapi
相关产品推荐
相关产品推荐

