Codeforces String Score问题测试点11超时,求Python代码优化方案
问题分析
你遇到的超时问题核心是原代码的时间复杂度过高,同时存在多处逻辑错误,即便不超时也无法通过测试用例。
原代码核心问题
- 频繁对列表执行
del删除中间元素的操作,每次删除的时间复杂度是O(n),当字符串长度较大时,总时间复杂度会达到O(n²),直接触发超时 - 逻辑缩进错误:判断字符为
Y的代码缩进在W的分支下,永远不会执行 - 索引逻辑错误:
i=0时访问S[i-1]会取到字符串最后一个元素,完全不符合题目要求的从左到右处理规则 - 核心规则实现缺失:
Z的处理逻辑、X的跳过下一个字符逻辑均未正确实现 - 遍历规则错误:使用固定长度
range(N)遍历动态变化的字符串,会出现索引越界、漏处理字符的问题
优化方案
使用双端队列deque存储字符串,deque的左弹出、尾部追加操作时间复杂度均为O(1),每个字符最多入队、出队各一次,总时间复杂度为O(n),完全满足大长度字符串的处理要求。
正确实现代码
from collections import deque n = int(input()) s = deque(input()) score = 0 while s: curr = s.popleft() if curr == 'V': score += 5 elif curr == 'W': score += 2 elif curr == 'X': # 存在下一个字符时直接跳过 if s: s.popleft() elif curr == 'Y': # 存在下一个字符时移到末尾 if s: moved = s.popleft() s.append(moved) elif curr == 'Z': if s: next_ch = s[0] if next_ch == 'V': score //= 5 s.popleft() elif next_ch == 'W': score //= 2 s.popleft() print(score)
逻辑说明
该实现完全贴合题目规则:
- 所有字符从左到右依次处理
- 当弹出的字符为
X/Y/Z且队列已空时,自动跳过后续操作,符合「末尾的X/Y/Z忽略操作」的要求 - 所有特殊字符的处理规则均严格按照题目描述实现,没有逻辑偏差
内容的提问来源于stack exchange,提问作者Mohamed_Elsharaky
相关产品推荐
相关产品推荐

