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

如何高效找出字符串数组中所有字符串的公共字符?

高效找出数组中所有字符串的共有字符

针对你的需求,这里有两种比多层循环更高效且易维护的实现方式:

方法一:利用集合与every短路特性(适用于只需找出存在的共有字符)

以数组第一个字符串的字符为基准,通过Set去重后,用every方法快速验证每个字符是否存在于所有其他字符串中——every会在遇到不满足条件的字符串时立即终止遍历,避免冗余操作。

let arr = ["robin", "rohit", "roy"];

// 提取第一个字符串的唯一字符集合
const firstUniqueChars = new Set(arr[0].split(''));
// 筛选出所有字符串都包含的字符
const commonChars = [...firstUniqueChars].filter(char => 
  arr.every(str => str.includes(char))
);

console.log(commonChars.join(',')); // 输出: r,o

方法二:字符频率统计(适用于需考虑重复次数的场景)

如果需要统计每个共有字符在所有字符串中的最小出现次数(比如某个字符在不同字符串中重复出现,取最少的重复次数),可以用Map统计频率并逐步缩小范围,中途若没有共有字符还能提前终止循环。

let arr = ["robin", "rohit", "roy"];

// 统计第一个字符串的字符出现次数
const charCountMap = new Map();
for (const char of arr[0]) {
  charCountMap.set(char, (charCountMap.get(char) || 0) + 1);
}

// 遍历剩余字符串,更新共有字符的最小出现次数
for (let i = 1; i < arr.length; i++) {
  const currentStrCount = new Map();
  for (const char of arr[i]) {
    currentStrCount.set(char, (currentStrCount.get(char) || 0) + 1);
  }

  // 只保留当前字符串中存在的字符,且频率取两者最小值
  for (const [char, count] of charCountMap) {
    if (!currentStrCount.has(char)) {
      charCountMap.delete(char);
    } else {
      charCountMap.set(char, Math.min(count, currentStrCount.get(char)));
    }
  }

  // 若无共有字符,提前结束循环
  if (charCountMap.size === 0) break;
}

// 生成去重后的结果(和示例输出一致)
const uniqueCommonChars = [...new Set(charCountMap.keys())];
console.log(uniqueCommonChars.join(',')); // 输出: r,o

比多层循环更高效的原因

  1. 方法一通过Set去重,避免对同一个字符重复检查;every的短路特性减少了不必要的字符串遍历。
  2. 方法二通过提前终止循环(当无共有字符时),减少了后续无效的计算。

内容的提问来源于stack exchange,提问作者Jitendra Pathak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:20:37