
本文介绍一种基于后缀匹配的字符串智能拼接方法,可准确识别并消除两段文本末尾与开头的重复语句,生成自然连贯的完整句子,适用于语音转文字等场景。
本文介绍一种基于后缀匹配的字符串智能拼接方法,可准确识别并消除两段文本末尾与开头的重复语句,生成自然连贯的完整句子,适用于语音转文字等场景。
在语音转文字(STT)系统中,分段识别常导致前后句存在语义重叠——例如前一句以“had some time to”结尾,后一句以相同短语开头。若简单拼接,会产生冗余;若仅去重单词,则会破坏语法结构(如原问题中 this code transforms this + transforms this string 会被错误简化为 this code transforms this string,丢失关键动词重复所承载的强调语义)。
正确解法应聚焦子串级重叠检测,而非单词级去重。核心思路是:从 str2 的最长可能前缀开始试探,检查该前缀是否恰好是 str1 的后缀;一旦匹配成功,就将 str1 去掉该重叠后缀,再拼接完整 str2。
以下是优化实现(兼容标点、空格与边界情况):
function concatenateWithoutOverlap(str1, str2) {
// 边界处理:任一为空则直接返回另一方
if (!str1) return str2;
if (!str2) return str1;
// 从 str2 最长前缀开始尝试匹配 str1 的后缀
for (let i = str2.length; i > 0; i--) {
const prefix = str2.substring(0, i);
// 使用严格后缀匹配(注意:endsWith 支持空字符串,且保留标点与空格)
if (str1.endsWith(prefix)) {
// 移除 str1 末尾重叠部分,拼接完整 str2
return str1.slice(0, str1.length - prefix.length) + str2;
}
}
// 无重叠时直接拼接(可选添加空格逻辑)
return str1 + (str1.endsWith(' ') || str2.startsWith(' ') ? '' : ' ') + str2;
}
// 测试用例
console.log(concatenateWithoutOverlap(
"It was great, I finally had some time to",
"had some time to relax and catch up on my reading."
));
// → "It was great, I finally had some time to relax and catch up on my reading."
console.log(concatenateWithoutOverlap(
"this code transforms this",
"transforms this string"
));
// → "this code transforms this string"
✅ 关键优势:
- 精确到字符级匹配,保留标点、大小写与空格语义;
- 时间复杂度最坏为 O(n²),但实际语音场景中重叠通常较短,性能足够;
- 不修改原始字符串结构,避免单词级去重导致的语法断裂。
⚠️ 注意事项:
- 若 str2 开头含空格或标点(如 " , relax..."),需预处理标准化空白;
- 对于模糊重叠(如 str1="I went to" + str2="to the park"),当前逻辑仅匹配连续完全相等子串;如需支持更鲁棒的语义对齐(如停用词忽略、词干匹配),需引入 NLP 库(如 compromise.js);
- 生产环境建议增加最大重叠长度限制(如 i > Math.min(20, str2.length)),防止长文本遍历开销。
该方法直击语音识别断句重叠的本质——局部字符串重复,以简洁、可靠、可维护的方式解决了真实业务中的连贯性难题。










