如何避免for循环比较字符串时重复字母被重复匹配?
解决重复匹配的共有字母提取问题
你的代码存在几个明显问题:
- 仅处理了数组中第3个元素(
fruits[2]),未遍历整个数组 - 匹配到字符就执行
return,直接终止循环,无法处理后续内容 - 判断逻辑冗余:
myString[j].indexOf(fruit[i])等价于直接判断单个字符相等,用myString[j] === fruit[i]即可 - 没有处理重复字母的重复匹配问题,导致出现多次输出同一字母的情况
下面提供几种不同需求下的解决方案:
需求1:提取不重复的共有字母
如果只需要保留两者共有的、不重复的字母,可以用集合来快速去重和查找:
const fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"]; let myString = "apple"; // 将目标字符串转小写后转为集合,方便去重和快速查询 const targetCharSet = new Set(myString.toLowerCase().split('')); const commonChars = new Set(); // 遍历数组中所有字符串 for (const fruit of fruits) { const lowerCaseFruit = fruit.toLowerCase(); // 遍历当前字符串的每个字符 for (const char of lowerCaseFruit) { if (targetCharSet.has(char)) { commonChars.add(char); // 从目标集合中移除该字符,避免后续重复匹配 targetCharSet.delete(char); } } } // 将集合转为字符串输出 console.log([...commonChars].join('')); // 输出:apple
需求2:按最小出现次数保留重复字母
如果需要保留重复字母,但次数取数组中该字符总出现次数与目标字符串中出现次数的最小值(比如数组里总共有2个'a',目标有1个'a',结果就保留1个'a'),可以通过统计字符出现次数实现:
const fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"]; let myString = "apple"; // 统计目标字符串中各字符的出现次数 const targetCharCount = {}; for (const char of myString.toLowerCase()) { targetCharCount[char] = (targetCharCount[char] || 0) + 1; } // 统计数组中所有字符串的字符出现次数 const fruitCharCount = {}; for (const fruit of fruits) { const lowerCaseFruit = fruit.toLowerCase(); for (const char of lowerCaseFruit) { fruitCharCount[char] = (fruitCharCount[char] || 0) + 1; } } // 生成结果:取每个共有字符的最小出现次数 const result = []; for (const char in targetCharCount) { if (fruitCharCount[char]) { const minCount = Math.min(targetCharCount[char], fruitCharCount[char]); result.push(char.repeat(minCount)); } } console.log(result.join('')); // 输出:apple
基于你原嵌套循环思路的修正
如果坚持要用嵌套for循环实现去重的共有字母提取,可修改如下:
const fruits = ["Banana", "Orange", "Apple", "Mango", "Apple"]; let myString = "apple"; const lowerCaseTarget = myString.toLowerCase(); const commonChars = []; // 遍历数组每个元素 for (let i = 0; i < fruits.length; i++) { const lowerCaseFruit = fruits[i].toLowerCase(); // 遍历当前字符串的每个字符 for (let j = 0; j < lowerCaseFruit.length; j++) { const currentChar = lowerCaseFruit[j]; // 检查目标包含该字符且结果中未添加过 if (lowerCaseTarget.includes(currentChar) && !commonChars.includes(currentChar)) { commonChars.push(currentChar); } } } console.log(commonChars.join('')); // 输出:apple
内容的提问来源于stack exchange,提问作者allsaints1977
相关产品推荐
相关产品推荐

