字符串序列中匹配用户输入的三元组替换方案实现咨询
实现思路
拆解为3个核心步骤按顺序实现即可:
- 第一步:校验子串存在性,定位匹配起始索引
直接用字符串内置的find()方法判断user_input是否是main的子串,返回值为-1直接终止流程提示无匹配;如果有匹配,拿到子串在主串里的起始下标start_idx,计算结束下标end_idx = start_idx + len(user_input) - 1。 - 第二步:定位命中的所有三元组
先把主串按每3个字符拆分得到三元组列表,同时记录每个三元组在原主串里的起始、结束下标范围。遍历所有三元组的下标范围,只要该范围和子串的[start_idx, end_idx]存在重叠,就判定为命中三元组,记录这些三元组的索引位置即可。 - 第三步:替换命中的三元组
提前给alternatives字典构建反向映射:把相同值的三元组存为列表,键为原数字值,值为对应三元组列表。遍历之前命中的三元组索引,拿到原三元组后查alternatives得到对应分组编号,从反向映射的同分组列表中任选一个有效替代项替换原三元组,最后拼接所有三元组得到结果。
可运行代码示例
from random import choice # 示例输入数据 alternatives = {"atr": "1", "atx": "1", "erf": "2", "erg": "2", "erl": "2", "ghe": "3", "gaz": "3", "bnv": "4", "bnn": "4"} main = "atrerfghebnv" user_input = "fgheb" def process_strings(main, alternatives, user_input): # 步骤1:定位子串的起始、结束下标 start_idx = main.find(user_input) if start_idx == -1: return "无匹配子串" end_idx = start_idx + len(user_input) - 1 # 步骤2:拆分三元组,记录下标范围,筛选命中的三元组索引 triplets = [] triplet_ranges = [] for i in range(0, len(main), 3): triplet = main[i:i+3] triplets.append(triplet) triplet_ranges.append((i, i+2)) hit_indexes = [] for idx, (t_start, t_end) in enumerate(triplet_ranges): # 区间重叠判定逻辑 if not (t_end < start_idx or t_start > end_idx): hit_indexes.append(idx) # 步骤3:构建反向映射,替换命中三元组 reverse_alt = {} for triplet, group_id in alternatives.items(): reverse_alt.setdefault(group_id, []).append(triplet) for idx in hit_indexes: original = triplets[idx] group_id = alternatives[original] # 同组排除原三元组随机选,若无其他选项则保留原三元组 candidates = [t for t in reverse_alt[group_id] if t != original] triplets[idx] = choice(candidates) if candidates else original return ''.join(triplets) # 运行测试 print(process_strings(main, alternatives, user_input)) # 示例可能输出:atrerggazbnn
内容的提问来源于stack exchange,提问作者eh329
相关产品推荐
相关产品推荐

