如何在C语言中实现移除字符数组内连续重复行的函数
实现连续重复行的去重函数
嘿,这个需求我太熟了!你想要的其实是连续重复项去重——只保留连续重复组的第一行,非连续的相同行完全不用动,甚至还支持非完全匹配的情况对吧?我来给你一步步拆解怎么实现~
核心思路
实现这个功能的关键逻辑很简单:
- 维护一个结果列表,用来存储去重后的内容
- 记录“上一行”的内容,作为当前行的对比基准
- 遍历原数组时,每一行都和上一行对比:
- 如果两者不满足“连续重复”的条件,就把当前行加入结果列表,同时更新“上一行”为当前行
- 如果满足连续重复,直接跳过当前行
基础版:完全匹配连续重复
先从最基础的“整行完全相同”的情况开始,拿Python举例子,这个逻辑换成其他语言(比如Java、C#)也完全通用:
def remove_consecutive_duplicates(lines): # 处理空数组的边界情况 if not lines: return [] result = [lines[0]] # 先把第一行加入结果 for line in lines[1:]: # 对比当前行和结果列表的最后一行(也就是上一行) if line != result[-1]: result.append(line) return result
测试示例
# 你的示例输入 input_lines = ["Hi", "Hello", "Hello", "Hello", "Hello"] # 调用函数 output_lines = remove_consecutive_duplicates(input_lines) print(output_lines) # 输出: ["Hi", "Hello"]
扩展版:非完全匹配的连续重复
你提到“不一定要求整行完全相同”,那我们可以把对比逻辑改成自定义的匹配规则,比如以下几种常见场景:
场景1:前缀匹配(前N个字符相同就算连续重复)
比如只要两行的前5个字符一样,就判定为连续重复:
def remove_consecutive_prefix_duplicates(lines, prefix_length=5): if not lines: return [] result = [lines[0]] for line in lines[1:]: # 处理行长度小于前缀长度的情况 prev_prefix = result[-1][:prefix_length] if len(result[-1]) >= prefix_length else result[-1] curr_prefix = line[:prefix_length] if len(line) >= prefix_length else line if curr_prefix != prev_prefix: result.append(line) return result
场景2:相似度匹配(两行相似度超过阈值就算连续重复)
用字符串相似度算法(比如编辑距离)来判断,比如相似度超过80%就算连续重复:
import difflib def remove_consecutive_similar_duplicates(lines, similarity_threshold=0.8): if not lines: return [] result = [lines[0]] for line in lines[1:]: # 计算两行的相似度(0-1之间,1表示完全相同) similarity = difflib.SequenceMatcher(None, result[-1], line).ratio() if similarity < similarity_threshold: result.append(line) return result
注意事项
- 所有版本都保留了非连续的相同行,比如输入是
["Hi", "Hello", "Hi"],输出还是["Hi", "Hello", "Hi"],完全符合你的需求 - 边界情况(空数组、单一行数组)都做了处理,不会报错
内容的提问来源于stack exchange,提问作者jtuntalan
相关产品推荐
相关产品推荐

