生成两个字符串的所有交错组合:我的JS实现逻辑何处出错?
代码问题排查与修复
你的递归实现核心错误在于只用了一个索引i同时跟踪两个字符串的遍历进度,这会导致两个字符串的字符取出顺序混乱,无法保证各自的相对顺序,同时基准条件的字符串追加逻辑也有误。具体问题和修复方案如下:
核心问题分析
单一索引逻辑错误:
你用同一个i控制str1和str2的遍历位置,比如第一次取str1[i](i=0,即'a')后,递归调用时i+1=1,此时取str2[i]会直接拿到str2[1](即'd'),跳过了str2[0]的'c',完全破坏了str2的字符相对顺序。基准条件字符串追加错误:
当其中一个字符串遍历完成时,你直接追加了整个另一个字符串,而不是剩余未遍历的部分。比如str1遍历完时,应该追加str2从当前索引开始的剩余字符,而非整个str2,否则会重复之前已经添加过的字符。
修复后的代码
function interleaving(str1, str2) { const res = []; // 用两个独立索引i(跟踪str1)、j(跟踪str2) function backtrack(i, j, newStr) { // 两个字符串都遍历完成,将当前组合加入结果 if (i === str1.length && j === str2.length) { res.push(newStr); return; } // str1还有未遍历字符,取当前字符继续递归 if (i < str1.length) { backtrack(i + 1, j, newStr + str1[i]); } // str2还有未遍历字符,取当前字符继续递归 if (j < str2.length) { backtrack(i, j + 1, newStr + str2[j]); } } backtrack(0, 0, ""); return res; } // 测试示例 const result = interleaving("ab", "cd"); console.log(result); // 输出:["abcd", "acbd", "acdb", "cabd", "cadb", "cdab"]
修复说明
- 双索引独立跟踪:用
i专门记录str1的遍历位置,j记录str2的遍历位置,确保两个字符串的字符始终按自身顺序取出。 - 精准的基准条件:只有当两个字符串都遍历完成时,才将当前组合存入结果;每次递归仅处理未遍历的字符,避免重复追加。
- 局部结果数组:将
res放在函数内部,避免全局变量导致的多次调用结果污染问题。
内容的提问来源于stack exchange,提问作者ABGR
相关产品推荐
相关产品推荐

