1

我正在处理 CodeWars.com 上的一些“Kata”,并被困在 Permutations 问题上。

这是问题所在:在这个 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。我已经使用 return 控制台记录了 if 语句块,它应该返回正确的答案,但结果仍然是undefined. 考虑到它在 if 语句中得到了正确的答案并且没有进入 else 块,我不知道为什么这不起作用。

先感谢您!

4

2 回答 2

1

我想通了 - 我错过了return递归函数调用之前的语句。

于 2020-07-01T16:19:10.973 回答
0

这是一个基本的解决方案

 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")
于 2020-07-01T15:17:29.463 回答