You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串数组去重最优方案请求:保留元素原有顺序

字符串数组逆序去重(保留首次出现与原顺序)的最优方案

刚好处理过类似的需求,这个问题的核心是自定义重复项的判断规则(互为逆序的元素视为重复),同时要严格保留原数组的顺序和首次出现的元素。下面是我验证过的高效解决方案:

核心思路

要识别逆序的重复项,关键是给每个元素生成一个标准化的唯一标识:把每个逗号分隔的元素拆分成子字符串,排序后重新拼接。比如"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:37:23