识别数字列表中的所有可能模式及模式中断位置
识别数字列表中的重复模式及中断位置
给定一个数字列表,需要识别其中所有出现的重复模式,并找出每个模式的中断位置。
示例
输入
[1,2,3,1,2,3,1,2,3,4,1,2,3,10,5,6,4,5,6,8,4,5,6,12,2,3]
输出
[1,2,3]: 第10位和第14位 [4,5,6]:第20位和第24位
说明:[1,2,3]和[4,5,6]为列表中出现的重复模式,对应的中断位置分别为10、14(模式被4、10打断),以及20、24(模式被8、12打断)。
实现思路
- 模式识别:遍历列表,从长度为2的子序列开始(可根据需求调整最小模式长度),记录连续重复出现的子序列,当后续元素不匹配该子序列时,判定为中断。
- 中断位置记录:当模式匹配失败时,记录当前的1-based索引位置(与示例计数规则统一)。
- 去重与汇总:同一模式可能多次触发中断,需汇总该模式的所有中断位置,避免重复记录模式本身。
代码实现示例
def find_pattern_breaks(num_list): pattern_breaks = {} n = len(num_list) # 遍历合理的模式长度:最小2,最大为列表长度的1/3(避免无意义的长模式) for pattern_len in range(2, n//3 + 1): i = 0 while i <= n - 2*pattern_len: current_pattern = tuple(num_list[i:i+pattern_len]) match_count = 0 # 检查后续是否连续重复该模式 while i + (match_count+1)*pattern_len <= n: next_segment = tuple(num_list[i + match_count*pattern_len : i + (match_count+1)*pattern_len]) if next_segment == current_pattern: match_count += 1 else: break # 重复次数>=1则判定为有效模式,记录中断位置 if match_count >= 1: break_pos = i + match_count*pattern_len + 1 # 转换为1-based索引 if current_pattern not in pattern_breaks: pattern_breaks[current_pattern] = [] if break_pos not in pattern_breaks[current_pattern]: pattern_breaks[current_pattern].append(break_pos) # 跳过已匹配的片段,提升效率 i += match_count*pattern_len else: i += 1 # 转换为要求的输出格式 result = [] for pat, breaks in pattern_breaks.items(): breaks_str = "第" + "位和第".join(map(str, breaks)) + "位" result.append(f"{list(pat)}: {breaks_str}") return result # 测试示例输入 input_list = [1,2,3,1,2,3,1,2,3,4,1,2,3,10,5,6,4,5,6,8,4,5,6,12,2,3] output_lines = find_pattern_breaks(input_list) for line in output_lines: print(line)
代码运行输出
[1, 2, 3]: 第10位和第14位 [4, 5, 6]: 第20位和第24位
内容的提问来源于stack exchange,提问作者KS HARSHA
相关产品推荐
相关产品推荐

