
本文介绍一种基于后缀匹配的字符串智能拼接方法,适用于语音转文字等场景,能准确识别并消除两段文本末尾与开头的重复子串,生成自然连贯的完整句子。
本文介绍一种基于后缀匹配的字符串智能拼接方法,适用于语音转文字等场景,能准确识别并消除两段文本末尾与开头的重复子串,生成自然连贯的完整句子。
在语音识别(ASR)后处理中,常出现分段识别导致的语义重叠问题:前一段以某短语结尾,后一段以相同短语开头(如 "had some time to"),直接拼接会产生冗余。此时,简单去重单词(如按空格分割后去重)会破坏语序、丢失标点甚至误删非重叠词汇(例如 "this code transforms this" 与 "transforms this string" 中 "this" 在句首和句中重复,不应全局去重)。
正确思路是:将 str1 视为前缀,str2 视为待衔接后缀,寻找 str2 的最长前缀,该前缀恰好是 str1 的后缀——即求两字符串的「最大重叠边界」。这本质上是字符串对齐问题,可通过从长到短尝试 str2 的前缀来高效解决。
以下是优化后的实现(修复原答案中潜在的边界问题,并增强健壮性):
function concatenateWithoutOverlap(str1, str2) {
// 边界处理:任一为空则直接返回另一方
if (!str1) return str2;
if (!str2) return str1;
// 从 str2 最长可能重叠长度开始尝试(最多为 str1 长度,且不超过 str2 长度)
const maxOverlap = Math.min(str1.length, str2.length);
for (let len = maxOverlap; len >= 0; len--) {
const prefixOfStr2 = str2.substring(0, len);
// 检查 str1 是否以该 prefix 结尾(注意:需确保 str1 长度足够)
if (len <p>使用示例:</p><pre class="brush:php;toolbar:false;">const str1 = "It was great, I finally had some time to";
const str2 = "had some time to relax and catch up on my reading.";
console.log(concatenateWithoutOverlap(str1, str2));
// 输出: "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"
⚠️ 注意事项:
- 该方法基于子串完全匹配,区分大小写与标点(如 "to " 和 "to" 不视为重叠),因此预处理建议统一清理尾部空格或标准化标点;
- 若需支持模糊匹配(如忽略逗号、大小写),应在比较前对 prefixOfStr2 和 str1 的对应后缀做规范化处理(如 .trim().toLowerCase());
- 时间复杂度为 O(n²),对普通 ASR 输出(通常
总结:解决语音文本拼接的核心在于精准定位语义重叠边界,而非单词级去重。上述函数以简洁逻辑实现了“最长公共后缀-前缀”对齐,兼顾准确性与实用性,可直接集成至语音后处理流水线中。










