You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成两个字符串的所有交错组合:我的JS实现逻辑何处出错?

代码问题排查与修复

你的递归实现核心错误在于只用了一个索引i同时跟踪两个字符串的遍历进度,这会导致两个字符串的字符取出顺序混乱,无法保证各自的相对顺序,同时基准条件的字符串追加逻辑也有误。具体问题和修复方案如下:

核心问题分析

  1. 单一索引逻辑错误:
    你用同一个i控制str1和str2的遍历位置,比如第一次取str1[i](i=0,即'a')后,递归调用时i+1=1,此时取str2[i]会直接拿到str2[1](即'd'),跳过了str2[0]的'c',完全破坏了str2的字符相对顺序。

  2. 基准条件字符串追加错误:
    当其中一个字符串遍历完成时,你直接追加了整个另一个字符串,而不是剩余未遍历的部分。比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:37:21