如何基于首尾字符重叠拼接字符串?附现有实现代码
基于字符串首尾重叠拼接的实现方案
你提到的需求是把两个字符串str1 = 'foobarbaz'和str2 = 'bazfoo'根据首尾重叠部分拼接成'foobarbazfoo',现有代码已经有了核心思路的雏形,但还不完整,我来帮你完善并解释清楚。
现有代码的问题分析
原函数merge已经在尝试寻找两个字符串的最大重叠长度,但存在几个明显的问题:
- 循环从
i=0开始会匹配空字符串,这属于无效的重叠匹配 - 缺少最终拼接结果的返回逻辑
- 异常提示内容不完整
完整的实现代码
function merge(str1, str2) { // 最大可能的重叠长度不会超过两个字符串中较短的那个 const maxOverlapSize = Math.min(str1.length, str2.length); let maxOverlapIndex = 0; // 从1开始遍历,寻找最长的有效重叠段 for (let i = 1; i <= maxOverlapSize; i++) { // 截取str1的最后i个字符作为后缀 const str1Suffix = str1.slice(str1.length - i); // 截取str2的前i个字符作为前缀 const str2Prefix = str2.slice(0, i); if (str1Suffix === str2Prefix) { maxOverlapIndex = i; } } // 若未找到有效重叠,抛出异常 if (maxOverlapIndex === 0) { throw new Error('Strings do not have overlapping suffix and prefix'); } // 拼接结果:str1 + 去掉重叠部分的str2 return str1 + str2.slice(maxOverlapIndex); } // 测试你的示例 const str1 = 'foobarbaz'; const str2 = 'bazfoo'; console.log(merge(str1, str2)); // 输出: 'foobarbazfoo'
代码细节说明
- 用
slice替代了非标准的substr,保证代码的兼容性和规范性 - 循环从
i=1开始,跳过了空字符串的无效匹配,只寻找有实际意义的重叠段 - 每次循环都会更新最大重叠长度,确保最终取到的是最长的有效重叠
- 拼接时通过
slice(maxOverlapIndex)去掉str2中已经和str1重叠的部分,避免重复内容
内容的提问来源于stack exchange,提问作者koryakinp
相关产品推荐
相关产品推荐

