字符串数组去重最优方案请求:保留元素原有顺序
字符串数组逆序去重(保留首次出现与原顺序)的最优方案
刚好处理过类似的需求,这个问题的核心是自定义重复项的判断规则(互为逆序的元素视为重复),同时要严格保留原数组的顺序和首次出现的元素。下面是我验证过的高效解决方案:
核心思路
要识别逆序的重复项,关键是给每个元素生成一个标准化的唯一标识:把每个逗号分隔的元素拆分成子字符串,排序后重新拼接。比如"a1,a2"和"a2,a1"排序后都会变成"a1,a2",这样就能用一个集合快速判断该类元素是否已经出现过。
遍历原数组时,对每个元素生成标准化标识:
- 如果标识不在集合中,就保留当前元素,并将标识加入集合
- 如果标识已存在,直接跳过该元素
这种方法既保证了原顺序,又利用集合O(1)的查找效率,整体性能非常出色。
JavaScript 实现示例
const originalArray = ["a1,a2", "a3,a4", "a2,a1", "a5,a3"]; // 生成标准化键:拆分后排序再拼接 const getNormalizedKey = (str) => str.split(',').sort().join(','); const seenKeys = new Set(); const uniqueArray = originalArray.filter(item => { const key = getNormalizedKey(item); if (!seenKeys.has(key)) { seenKeys.add(key); return true; } return false; }); console.log(uniqueArray); // 输出: ["a1,a2", "a3,a4", "a5,a3"]
Python 实现示例
如果用Python处理,思路完全一致:
original_array = ["a1,a2", "a3,a4", "a2,a1", "a5,a3"] def get_normalized_key(s): return ','.join(sorted(s.split(','))) seen_keys = set() unique_array = [] for item in original_array: key = get_normalized_key(item) if key not in seen_keys: seen_keys.add(key) unique_array.append(item) print(unique_array) # 输出: ['a1,a2', 'a3,a4', 'a5,a3']
方案优势
- 时间效率:整体复杂度为O(n * k log k),其中n是数组长度,k是每个元素拆分后的子元素数量(这里k=2,
k log k可视为常数),实际接近O(n),是这类问题的最优时间复杂度之一 - 逻辑清晰:标准化键的方式直观易懂,后续如果需要调整重复判断规则(比如忽略大小写),只需要修改
getNormalizedKey函数即可 - 严格符合需求:完美保留原数组顺序,只保留首次出现的元素,准确识别逆序重复项
内容的提问来源于stack exchange,提问作者Sharath Nayak
相关产品推荐
相关产品推荐

