如何高效找出字符串数组中所有字符串的公共字符?
高效找出数组中所有字符串的共有字符
针对你的需求,这里有两种比多层循环更高效且易维护的实现方式:
方法一:利用集合与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
比多层循环更高效的原因
- 方法一通过
Set去重,避免对同一个字符重复检查;every的短路特性减少了不必要的字符串遍历。 - 方法二通过提前终止循环(当无共有字符时),减少了后续无效的计算。
内容的提问来源于stack exchange,提问作者Jitendra Pathak
相关产品推荐
相关产品推荐

