求JavaScript实现n选r的字符串排列函数(P(n,r))
关于部分排列(P(n,r))的JavaScript实现及关键词说明
关键词修正
你之前搜不到目标函数,是因为常规的"permutations"关键词默认指向全排列(n!)。要找对应P(n,r)的实现,应该用以下关键词:
- k-permutations
- partial permutations(部分排列)
- permutations of n elements taken r at a time
JavaScript实现
下面是一个通用的部分排列生成函数,支持数组输入(比如你的车辆列表),返回所有长度为r的有序排列:
function getPartialPermutations(items, r) { const result = []; const used = new Array(items.length).fill(false); function backtrack(current) { if (current.length === r) { result.push([...current]); return; } for (let i = 0; i < items.length; i++) { if (used[i]) continue; used[i] = true; current.push(items[i]); backtrack(current); current.pop(); used[i] = false; } } backtrack([]); return result; }
针对字符串的适配版本
如果你的输入是字符串(比如单个字符组成的字符串),可以用这个适配函数:
function getStringPartialPermutations(str, r) { const items = str.split(''); const permutations = getPartialPermutations(items, r); return permutations.map(arr => arr.join('')); }
示例验证(你的车辆场景)
假设你有16辆车的数组:
const cars = ['车1', '车2', '车3', ..., '车16']; // 完整16辆车列表 const parkingPermutations = getPartialPermutations(cars, 4); console.log(parkingPermutations.length); // 输出 16*15*14*13 = 43680,和P(16,4)结果一致
每个子数组代表一种车位顺序(第一个元素是左侧车位,第二个中间,以此类推),完全符合你对车位顺序区分的要求。
补充说明
- 该实现用回溯法生成,逻辑清晰且高效,避免重复计算
- 如果处理超大n和r(比如n=100, r=20),会生成极多结果,建议提前评估内存占用
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

