JavaScript 中的递归字符串排列

JavaScriptJavaScriptBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将探索JavaScript中字符串排列的概念。我们将使用递归生成给定字符串的所有可能排列,包括重复项。我们还将讨论如何使用 Array.prototype.map()Array.prototype.reduce() 方法简化代码并合并不同的排列。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("`JavaScript`")) -.-> javascript/BasicConceptsGroup(["`Basic Concepts`"]) javascript(("`JavaScript`")) -.-> javascript/AdvancedConceptsGroup(["`Advanced Concepts`"]) javascript/BasicConceptsGroup -.-> javascript/variables("`Variables`") javascript/BasicConceptsGroup -.-> javascript/data_types("`Data Types`") javascript/BasicConceptsGroup -.-> javascript/arith_ops("`Arithmetic Operators`") javascript/BasicConceptsGroup -.-> javascript/comp_ops("`Comparison Operators`") javascript/BasicConceptsGroup -.-> javascript/cond_stmts("`Conditional Statements`") javascript/BasicConceptsGroup -.-> javascript/array_methods("`Array Methods`") javascript/BasicConceptsGroup -.-> javascript/obj_manip("`Object Manipulation`") javascript/AdvancedConceptsGroup -.-> javascript/higher_funcs("`Higher-Order Functions`") subgraph Lab Skills javascript/variables -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/data_types -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/arith_ops -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/comp_ops -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/cond_stmts -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/array_methods -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/obj_manip -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} javascript/higher_funcs -.-> lab-28626{{"`JavaScript 中的递归字符串排列`"}} end

字符串排列算法

要生成包含重复项的字符串的所有排列,请使用以下算法:

  1. 打开终端/SSH并输入 node 开始练习编码。
  2. 使用递归创建给定字符串的所有可能排列。
  3. 对于给定字符串中的每个字母,为其余字母创建所有部分排列。
  4. 使用 Array.prototype.map() 将该字母与每个部分排列组合。
  5. 使用 Array.prototype.reduce() 将所有排列合并到一个数组中。
  6. 基本情况是 String.prototype.length 等于 21
  7. ⚠️ 警告:执行时间会随着每个字符呈指数级增长。对于长度超过8到10个字符的字符串,环境可能会在尝试解决所有不同组合时挂起。

以下是该算法的JavaScript代码:

const stringPermutations = (str) => {
  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
  return str
    .split("")
    .reduce(
      (acc, letter, i) =>
        acc.concat(
          stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(
            (val) => letter + val
          )
        ),
      []
    );
};

你可以使用以下代码测试 stringPermutations 函数:

stringPermutations("abc"); // ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

总结

恭喜你!你已经完成了字符串排列实验。你可以在LabEx中练习更多实验来提升你的技能。

您可能感兴趣的其他 JavaScript 教程