用 Javascript 中的堆算法解决排列问题
Posted
技术标签:
【中文标题】用 Javascript 中的堆算法解决排列问题【英文标题】:Solving a Permutations problem with Heap's Algorithm in Javascript 【发布时间】:2020-10-22 01:17:15 【问题描述】:我正在处理 CodeWars.com 上的一些“Kata”问题,但遇到了排列问题。
问题来了:在这个 kata 中,您必须创建所有排列 输入字符串并删除重复项(如果存在)。这意味着,你 必须以所有可能的顺序对输入中的所有字母进行洗牌。
例子:
permutations('a'); // ['a'] permutations('ab'); // ['ab', 'ba'] permutations('aabb'); // ['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa']
排列顺序无关紧要。
这是我的解决方案:
function permutations(string)
const swap = (string, x, y) =>
const stringArray = string.split('')
const swapVar = stringArray[x]
stringArray[x] = stringArray[y]
stringArray[y] = swapVar
return stringArray.join('')
const permutate = (k, arr) =>
if (k === 1)
return arr
else
for (let i = 0; i < k - 1; i++)
if (k % 2 === 0)
arr.push(swap(string, i, k-1))
else
arr.push(swap(string, 0, k-1))
permutate(k - 1, arr)
return permutate(string.length, [string])
当你传入一个字母时,它工作正常。两个字母,它返回undefined
。我已经通过控制台记录了 if 语句块和 return,它应该返回正确的答案,但结果仍然是 undefined
。考虑到它在 if 语句中得到了正确的答案并且没有进入 else 块,我不知道为什么这不起作用。
提前谢谢你!
【问题讨论】:
【参考方案1】:这是一个基本的解决方案
String.prototype.replaceAt = function(index, replacement)
return this.substr(0, index) + replacement + this.substr(index +
replacement.length);
var words = [];
var string = "lyes";
for(var i = 0;i< string.length;i++)
for(var j = 0;j<string.length;j++)
var tempChar;
if(i!==j)
tempChar = string[j]
var str = string.replaceAt(j,string[i])
str = str.replaceAt(i,tempChar)
if(!words.includes(str))
words.push(str)
console.log(str)
console.log(words.length +" words found")
【讨论】:
这并没有找到所有的排列。对于您的'lyes'
示例,您最终只得到六个结果,但四个不同项目的实际排列有 24 个。【参考方案2】:
我想通了 - 我在递归函数调用之前错过了 return
语句。
【讨论】:
以上是关于用 Javascript 中的堆算法解决排列问题的主要内容,如果未能解决你的问题,请参考以下文章
算法系列之--Javascript和Kotlin的堆排序算法(原)
Python算法题——国际象棋棋盘(排列组合问题,最小的K个数)