求评改:统计字符串中连续BA/CA字符对最大数量的Python函数
优化方案:统计连续BA/CA字符对的最大数量
你原函数存在一个关键bug:当遍历到i=0时,访问s[i-1]会触发Python的负索引特性,取到字符串最后一个字符,这会导致错误的匹配逻辑(比如输入"A"时会出现无意义的判断)。另外从后往前遍历的逻辑可读性偏弱,换成从前往后遍历会更直观。
下面是优化后的函数,解决了索引问题,同时让逻辑更清晰:
def f(s: str) -> int: max_count = 0 current = 0 i = 0 n = len(s) while i < n - 1: # 检查当前位置与下一个位置是否构成BA或CA if (s[i] == 'B' and s[i+1] == 'A') or (s[i] == 'C' and s[i+1] == 'A'): current += 1 i += 2 # 跳过下一个字符,避免重叠匹配 else: # 更新最大计数并重置当前计数 if current > max_count: max_count = current current = 0 i += 1 # 循环结束后,检查最后一段未触发重置的连续计数 if current > max_count: max_count = current return max_count
改进点说明:
- 彻底避免索引越界:遍历终止条件设为
i < n - 1,确保每次都能安全访问s[i]和s[i+1],不会出现负索引或超出字符串长度的情况。 - 逻辑更直观:从字符串开头向后遍历,符合常规阅读习惯,匹配到目标字符对后直接跳过下一个字符,保证不重叠计数。
- 边界处理更完善:空字符串或长度小于2的字符串会直接返回0,无需额外判断。
- 无遗漏的计数更新:循环结束后补充检查最后一段连续计数,避免遗漏未触发重置逻辑的末尾匹配。
测试你的示例用例,结果均符合预期:
print(f("BABABA125")) # -> 3 print(f("234CA4BACA")) # -> 2 print(f("BABACABACA56")) # -> 5 print(f("1BABA24CA")) # -> 2
内容的提问来源于stack exchange,提问作者Ionnafan
相关产品推荐
相关产品推荐

