当前位置: 首页 > 知识库问答 >
问题:

给定字符串复杂度的所有置换

邰勇军
2023-03-14

我写了这个字符串的所有排列的解法。我有一个关于这个解决方案的时间和空间复杂性的问题。我假设时间复杂度将是O(n),因为嵌套循环和递归,而空间复杂度将是O(n)因为递归。

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

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

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个答案

查淮晨
2023-03-14

长度为n字符串存在o(n!)置换。

在生成置换中的每个字符串时,通过使用O(n)的for循环来执行O(n)操作

为什么有n!可能并不明显,但您正在递归调用带有剩余字符串的置换(..)函数,因此字符串长度将为n*(n-1)*(n-2)*(n-3)*...*1。

 类似资料:
  • 问题内容: 在Java 6之前,我们在上有一个固定时间的子字符串。在Java 7中,为什么要使用复制数组并降级到线性时间复杂度? 问题答案: 在Oracle错误#4513622中讨论了为什么要做出决定:(str)保留字段的子字符串会阻止对象的GC: 如示例中那样调用String.substring时,未分配用于存储的新字符数组。它使用原始String的字符数组。因此,支持原始字符串的字符数组在子字

  • 本文向大家介绍打印给定字符串的所有排列,包括了打印给定字符串的所有排列的使用技巧和注意事项,需要的朋友参考一下 打印给定字符串的所有排列是回溯问题的一个示例。我们将减小子字符串的大小以解决子问题,然后再次回溯以从该部分获得另一个排列。 例如,如果字符串是ABC,则所有排列将是ABC,ACB,BAC,BCA,CAB,CBA。 该算法的复杂度为O(n!)。这是一个巨大的复杂性。当字符串大小增加时,需要

  • 我已经解决了寻找最长回文子字符串的问题,但这是不同的。给定一个像“ababa”这样的字符串,所有前缀的最长回文子字符串的长度如下所示- “a”:“a”(长度1) “ab”:“a”或“b”(长度1) “aba”:“aba”(长度3) “abab”:“aba”或“bab”(长度3) “亚贝巴”:“亚贝巴”(长度5) null null 我们只需要长度,而不是实际的回文。有没有更容易/更好(就运行时复杂

  • 问题内容: 切片Python字符串的时间复杂度是多少?鉴于Python字符串是不可变的,我可以想象对它们进行切片或取决于切片的实现方式。 我需要编写一个遍历(可能很大)字符串的所有后缀的函数。我可以通过将后缀表示为整个字符串的元组和一个索引以开始从中读取字符来避免对字符串进行切片,但这很丑陋。相反,如果我天真地像这样写我的函数: … …将其时间复杂度是或,其中是? 问题答案: 简短的答案:通常是切

  • 我遇到了一个问题语句,要在给定的两个子字符串之间找到所有公共子字符串这样一种方式,在每种情况下都必须打印最长的子字符串。问题声明如下: 编写一个程序来查找两个给定字符串之间的公共子字符串。但不包括包含在较长公共子字符串中的子字符串。 null 在这种情况下,您不必使用字符串实用程序方法,如:contains、indexOf、StringTokenizer、split和replace。 我的算法是这

  • 问题内容: 找到字符串的所有排列的一种优雅方法是什么。例如,的排列会是和,但是较长的字符串呢?有任何实现示例吗? 问题答案: