字符串重复项替换问题:生成新内容仍存重复的解决求助
解决重复词替换后仍出现重复的问题
问题说明
需要处理重复词替换场景:将字符串中重复出现的词(除首次出现外)替换为随机生成的唯一词,但现有代码生成的替换词仍会和已有词重复。
示例:
- 输入:
"aaaa bbbb cccc bbbb cccc dddd eeee" - 错误输出:
"aaaa bbbb cccc aaaa eeee dddd eeee" - 期望输出:
"aaaa bbbb cccc ffff gggg dddd eeee"
原代码问题分析
- 重复原词处理不彻底:用
replacedSet标记原词,替换一次后就不再处理该原词的其他重复项,导致部分重复词未被替换。 - 替换词唯一性校验失效:仅基于替换前的词频统计判断替换词是否存在,未同步更新已生成的新替换词,导致新生成词可能和刚替换的词重复。
- 循环逻辑冗余且错误:
while循环的触发条件设计不合理,无法保证所有重复项都被处理。
修正后的代码
function generateRandomWord(length) { const letters = 'abcdefghijklmnopqrstuvwxyz'; // 生成与原词长度一致的重复字母词(匹配示例风格) const randomLetter = letters[Math.floor(Math.random() * letters.length)]; return randomLetter.repeat(length); } function formatTEXT(text) { const words = text.split(" "); const firstOccurrence = new Map(); // 记录每个词首次出现的索引 const existingWords = new Set(); // 保存所有已存在的词(原词+替换词) // 第一步:标记首次出现的词并加入已存在集合 words.forEach((word, index) => { if (!firstOccurrence.has(word)) { firstOccurrence.set(word, index); existingWords.add(word); } }); // 第二步:遍历替换非首次出现的重复词 for (let i = 0; i < words.length; i++) { const currentWord = words[i]; // 仅替换非首次出现的词 if (firstOccurrence.get(currentWord) !== i) { let replacement; // 循环生成直到得到唯一的替换词 do { replacement = generateRandomWord(currentWord.length); } while (existingWords.has(replacement)); words[i] = replacement; existingWords.add(replacement); } } return words.join(" "); } // 测试示例 console.log(formatTEXT("aaaa bbbb cccc bbbb cccc dddd eeee"));
代码改进说明
- 精准标记重复项:用
firstOccurrenceMap记录每个词的首次出现位置,明确区分需要替换的非首次重复项。 - 实时维护唯一词集合:
existingWords集合同步保存原词和已生成的替换词,确保新生成的替换词绝对唯一。 - 循环生成唯一替换词:通过
do-while循环生成替换词,直到得到不在existingWords中的结果,彻底避免重复。 - 简化逻辑:去掉冗余的
while循环,一次遍历即可完成所有替换,逻辑更清晰高效。
内容的提问来源于stack exchange,提问作者Erzen Krasniqi
相关产品推荐
相关产品推荐

