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

如何用JS递归实现变位词生成器?字符插入问题求解

解决JavaScript变位词生成函数的首字母插入问题

你的核心问题主要有两个:一是递归返回值类型不统一导致后续遍历出错,二是缺少首字母插入到指定位置的实现,同时循环的边界也没覆盖所有插入位置(比如字符串末尾)。下面是修正后的完整代码,附详细说明:

function anagram(str) {
  // 递归终止条件:返回包含单个字符的数组,保证后续处理的都是数组类型
  if (str.length === 1) return [str[0]];
  
  let collection = [];
  let firstChar = str[0];
  let subStr = str.slice(1);
  let subStrAnagram = anagram(subStr);

  // 遍历每个子串的变位词结果
  for (let subAnagram of subStrAnagram) {
    // 遍历所有可能的插入位置:0到子串长度(包含末尾位置)
    for (let j = 0; j <= subAnagram.length; j++) {
      // 用slice方法将首字母插入到j位置
      let newAnagram = subAnagram.slice(0, j) + firstChar + subAnagram.slice(j);
      collection.push(newAnagram);
    }
  }

  return collection;
}

// 测试示例
console.log(anagram("abc").join(",")); // 输出: abc,acb,bac,bca,cab,cba

关键修正点说明:

  • 统一递归返回类型:原代码中长度为1时返回单个字符串,递归后得到的subStrAnagram会混合字符串和数组,导致遍历逻辑混乱。改为返回数组[str[0]],确保所有递归层级返回的都是数组。
  • 覆盖所有插入位置:原循环j < subStrAnagram[i].length只覆盖到倒数第二个位置,改为j <= subAnagram.length才能把首字母插入到字符串末尾。
  • 实现首字母插入:利用字符串的slice方法,将子变位词拆分为0到j和j到末尾两部分,中间拼接首字母,完成插入操作。

内容的提问来源于stack exchange,提问作者zayd merzougui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:54:23