文本文件解析问题:寻找前四位不重复字符的标记索引失败
问题:查找文本中前四个字符无重复的标记字符索引
我需要解析一个文本文件,找到满足“前四个字符均不重复”的字符索引。例如字符串wxrgh中,h是标记字符,其索引为4——因为它的前四个字符wxrg均不重复。我将文本转为数组实现该逻辑,测试用例可正常运行,但实际输入无法得到正确结果。已尝试测试文档和单元测试,问题仍未解决。
相关代码如下:
重复判断函数
def Repeat(x): size = len(x) repeated = [] for i in range(_size): k = i + 1 for j in range(k, _size): if x[i] == x[j] and x[i] not in repeated: repeated.append(x[i]) return repeated
主逻辑代码
with open("input4.txt") as f: text = f.read() test_array = [] split_array = list(text) woah = "" for i in split_array: first = split_array[split_array.index(i)] second = split_array[split_array.index(i) + 1] third = split_array[split_array.index(i) + 2] fourth = split_array[split_array.index(i) + 3] test_array.append(first) test_array.append(second) test_array.append(third) test_array.append(fourth) print(test_array) if Repeat(test_array) != []: test_array = [] else: woah = split_array.index(i) print(woah) print(woah)
代码问题分析
- Repeat函数变量错误:函数内定义了
size = len(x),但循环使用的是未定义的_size,运行时会直接抛出NameError。同时该函数判断重复的逻辑冗余,效率低下。 - 循环逻辑错误:
- 使用
split_array.index(i)获取索引是致命问题:index()返回的是字符i在数组中第一次出现的位置,而非当前循环的位置。如果文本中有重复字符,后续循环会一直取第一个重复字符的索引,导致窗口位置完全错误。 - 每次循环往
test_array中追加四个字符,导致数组长度不断累积,最终检查的不是连续四个字符,而是所有追加的字符集合,逻辑完全偏离需求。
- 使用
- 结果索引计算错误:根据需求,标记字符的索引应为“前四个字符窗口的起始索引+4”,原代码中直接赋值为起始索引,不符合示例逻辑。
- 变量类型错误:
woah初始化为字符串类型,最终要存储数字索引,类型不匹配。
修正后的代码
def has_duplicates(chars): # 利用集合去重特性,长度相等则无重复字符 return len(set(chars)) != len(chars) with open("input4.txt") as f: text = f.read().strip() # 去除文本首尾的空白/换行符 char_list = list(text) result_index = -1 # 遍历所有可能的窗口起始索引,确保窗口有4个字符 for start_idx in range(len(char_list) - 3): # 获取当前窗口的4个连续字符 current_window = char_list[start_idx:start_idx+4] if not has_duplicates(current_window): # 标记字符的索引为起始索引+4 result_index = start_idx + 4 break # 找到第一个符合条件的结果就退出循环 print(result_index)
修正说明
- 替换冗余的重复判断逻辑,用集合实现高效的无重复检查。
- 改用索引循环,直接操作字符数组的位置,避免
index()方法的错误。 - 每次取连续的4个字符作为检查窗口,符合需求逻辑。
- 正确计算标记字符的索引,与示例规则一致。
- 初始化结果为-1,未找到符合条件的字符时返回该值,逻辑更严谨。
内容的提问来源于stack exchange,提问作者RiyaNRocks
相关产品推荐
相关产品推荐

