Python查找固定长度含最多元音子串的代码错误排查求助
需求说明
给定由小写英文字母组成的字符串s,以及代表子串长度的整数k,需要找到长度为k、包含元音字母数量最多的子串。
示例输入:s = 'azerdii',k = 5
所有长度为5的合法子串及对应元音数量:
- 'azerd' 元音数为2
- 'zerdi' 元音数为2
- 'erdii' 元音数为3
预期返回结果:'erdii'
问题排查
你给出的代码运行后元音计数列表为[2,4,7],和预期的[2,2,3]不符,核心问题是元音计数变量count的初始化位置错误:count变量定义在遍历子串的循环外,每次统计完一个子串的元音数量后没有重置,计数会持续累加,导致后续子串的计数等于前面所有子串的元音数之和加上当前子串的元音数,最终得到错误的累加结果。
另外你的函数目前没有实现最终返回最长元音子串的逻辑,只是打印了子串列表和计数列表。
修复后代码
def findSubstring(s, k): i = 0 lst = [] tempL = [] # 生成所有长度为k的合法子串 while(i != len(s)): a = i+k temp = s[i:a] if len(temp) < k: break lst.append(temp) if a != len(s): i+=1 else: break for word in lst: count = 0 # 每次统计新子串前重置计数 for alphabet in word: if alphabet in 'aeiou': count += 1 tempL.append(count) # 匹配最大计数对应的首个符合要求子串 max_count = max(tempL) max_index = tempL.index(max_count) return lst[max_index] s = input() k = int(input().strip()) print(findSubstring(s, k))
优化建议
如果处理较长的字符串,当前的暴力遍历方法时间复杂度为O(n*k),可以改用滑动窗口法将时间复杂度降到O(n):仅计算第一个窗口的元音数,后续窗口每次移出最左字符、移入最右字符,动态更新计数即可,不需要重复遍历整个子串。
内容的提问来源于stack exchange,提问作者NARAYAN
相关产品推荐
相关产品推荐

