给定字符串的所有排列 - 复杂性

时间:2018-03-28 21:54:21

标签: javascript algorithm

我写了这个字符串的所有排列的解决方案。我对此解决方案的时间和空间复杂性有疑问。 我假设时间复杂度为O(n³),因为嵌套循环和递归以及空间复杂度因为递归而为O(n)。

我的假设是否正确?如果是这样,有没有更好的性能解决方案?

https://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/

输入:“ABC”

输出:['ABC','ACB','BAC','BCA','CAB','CBA']

谢谢!

function permutation(string) {
    // Basecase
    if (string.length < 2) {
      return string; 
    }

    var permutations = []; // This array will hold our permutations

    for (var i = 0; i < string.length; i++) {
        var char = string[i];

        // Cause we don't want any duplicates:
        // if char is not matched, skip it this time
        // otherwise it will generate duplicated string 
      
        if (string.indexOf(char) != i) { 
          continue;           
        }
       
        var remainingString = string.slice(0,i) + string.slice(i+1,string.length);  
        var tempResult = permutation(remainingString) 
        for (var subPermutation of tempResult) {
            var result = char + subPermutation
            permutations.push(result)
        }
    }
  
    return permutations;
}

console.log(permutation('ABC'))

1 个答案:

答案 0 :(得分:2)

长度为O(n!)的字符串存在n个排列。

在排列中生成每个字符串时,您通过for循环O(n)进行O(string.length) = O(n)操作

为什么有n!可能不明显,但是你用剩余的字符串递归调用permutation(..)函数,所以字符串长度为n *(n - 1)*(n - 2) *(n - 3)* ...... * 1.

因此,算法的时间复杂度为O(n * n!)

其他流行的已知解决方案(基于交换,与您的类似,基于下一个排列)具有相同的时间复杂度。