在 JavaScript 中,有slice
、reduce
、filter
、substring
和更多方法来解决排列给定字符串或数组的所有可能试验的基本问题。
在这里,我们将展示如何从给定的输入中提取数组和字符串的组合。主要重点是将每个文字从数组或字符串中分离出来,并一个一个地交换其他文字。
在以下部分中,我们将通过必要的代码示例详细讨论该过程。
目录
1.给定数组的排列
我们将permute
用其中的另一个函数初始化一个函数backtrack
。backtrack
将递归调用此函数以执行正确的组合集。
代码片段:
var permute = function(nums){
var result = [];
var backtrack = (i, nums) => {
if(i===nums.length){
result.push(nums.slice());
return;
}
for(let j = i; j < nums.length; j++){
[nums[i],nums[j]] = [nums[j],nums[i]];
backtrack(i+1, nums);
[nums[i],nums[j]] = [nums[j],nums[i]];
}
}
backtrack(0, nums);
console.log(result);
return result;
};
permute([1,2,3]);
输出:
这里的主要动作定义了交换部分,我们将每个文字与一个试验(例如 [1,2,3])的另一个交换,并得出可能的组合。
从试验中[1,2,3]
,我们会得到[1,2,3] & [1,3,2]
。这部分将被执行,直到每个文字都得到检查。
在切换到下一个试验之前,我们1,2,3
通过再次交换(因为最后一个组合是)返回到基础试验( [1,3,2]
)。这就是回溯的操作方式。
形成一棵树以查看可能的试验,树的长度等于数组长度。最初,我们执行 aDFS
来解决这个问题,然后递归回溯过程来完成它
2.给定字符串的排列
在字符串的情况下,我们split
首先将字符串,然后我们将使用该方法通过递归调用函数reduce
来逐个连接可能的试验。permutationString
代码片段:
var permutationString = str => {
if (str.length <= 2) return str.length === 2 ? [str[0] + str[1], str[1] + str[0]] : [str];
return str
.split('')
.reduce(
(accumulator, letter, i) =>
accumulator.concat(permutationString(str.slice(0, i) + str.slice(i+1)).map(val => letter + val)),[]);
};
console.log(permutationString('abcd'));
输出:
根据累加器函数,我们保留了每个组合。
我们使用该slice
方法锁定某个字母并根据之前初始化的基本情况添加其余字母。最后,输出结果为所有预期模式的组合形式。
阶乘公式推导出方法排列,因此该问题的解决方案通常runtime error
适用于大型情况。但是,可以通过这种方式对具有适当可视化的问题进行基本推理。