我写了这个字符串的所有排列的解决方案。我对此解决方案的时间和空间复杂性有疑问。 我假设时间复杂度为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'))
答案 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!)
。
其他流行的已知解决方案(基于交换,与您的类似,基于下一个排列)具有相同的时间复杂度。