用 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 中的堆算法解决排列问题的主要内容,如果未能解决你的问题,请参考以下文章

用ES6巧妙的解决传统面试中的算法小问题!

算法系列之--Javascript和Kotlin的堆排序算法(原)

Python算法题——国际象棋棋盘(排列组合问题,最小的K个数)

什么与 Java 列表相关的微妙之处导致我的堆算法实现失败?

堆的算法排列 JavaScript 和递归的堆栈?

数组倒序排列,数组倒置,C语言数组倒序算法详解!