创建字符串的所有可行排列的清单

我当然会如何处理在x和y个性大小之间创建一个字符串的所有可行排列的清单,具有可变的个性清单。

任何一种语言肯定会起作用,但它需要是移动的。

0
2019-05-03 18:57:49
资源 分享
答案: 4

你将获得大量的字符串,毫无疑问......

\ sum_ {i = x} ^ y {\ frac {r!} {{(ri)}!}} http://www.codecogs.com/eq.latex?%5Csum_%7Bi=x%7D%5Ey% 20%7B%20%5Cfrac%7BR!%7D%7B%7B(RI)%7D!%7D%20%7D
其中,x和y也就是你如何指定它们而且r是我们从中挑选的各种个性 - 如果我正确地认出你的话。 你需要绝对创建这些根据需要,也不要粗心,并声称,创建一个powerset,然后过滤字符串的大小。

最明确的坚持不是创造这些的最有效手段,但它是一个有趣的分开,没有 - 更少。

Knuth(数量4,分册2,7.2.1.3)告诉我们(s,t) - 混合量s + 1点与t同时取 - - (s,t) - 混合是由Knuth使用的符号相当于{t \ choose {s + t} http://www.codecogs.com/eq.latex?%7Bt%20%5Cchoose%20%7Bs+t%7D%7D。 我们可以通过首先创建每个(s,t) - 混合二进制类型(因此,大小(s + t))以及计算每个1左边的0的变化来解决这个问题。

10001000011101 - - >变为排列:0,3,4,4,4,1

0
2019-05-08 15:53:17
资源

我只是在Ruby中快速地掀起了这个:

def perms(x, y, possible_characters)
  all = [""]
  current_array = all.clone
  1.upto(y) { |iteration|
    next_array = []
    current_array.each { |string|
      possible_characters.each { |c|
        value = string + c
        next_array.insert next_array.length, value
        all.insert all.length, value
      }
    }
    current_array = next_array
  }
  all.delete_if { |string| string.length < x }
end

您可以检查用于置换类型功能构造的语言API,并且您也可以编写更多最大化的代码,但如果数字都很高,我不能确定有很多方法可以实现很多结果。

无论如何,代码背后的建议是从大小为0的字符串开始,之后跟踪所有大小为Z的字符串,其中Z是模型中的现有维度。 之后,体验每个字符串,并将每个个性添加到每个字符串。 最后,删除x限制下面列出的任何类型,并返回结果。

我真的没有用可能无用的输入检查它(无效的个性清单,x的异常值以及y等)。

0
2019-05-07 18:10:56
资源

我不确定为什么你肯定打算这样做。 任何类型的x和y的合理巨大值的结果集肯定会是巨大的,并且当x和/或y增长时肯定会大大扩展。

允许声称你的可行个性集是字母表中的26个小写字母,并且你还要求你的应用程序创建大小= 5的所有排列。认为你没有记忆,你将获得11,881,376(即26的5的幂) )回弦。 大小约为6的凹凸,你也会得到308,915,776个字符串。 这些数字变得非常庞大,非常迅速。

下面是我用Java创建的补救措施。 你需要给出2个运行时争论(代表x和y)。 请享用。

public class GeneratePermutations {
    public static void main(String[] args) {
        int lower = Integer.parseInt(args[0]);
        int upper = Integer.parseInt(args[1]);

        if (upper < lower || upper == 0 || lower == 0) {
            System.exit(0);
        }

        for (int length = lower; length <= upper; length++) {
            generate(length, "");
        }
    }

    private static void generate(int length, String partial) {
        if (length <= 0) {
            System.out.println(partial);
        } else {
            for (char c = 'a'; c <= 'z'; c++) {
                generate(length - 1, partial + c);
            }
        }
    }
}
0
2019-05-07 18:03:39
资源

有很多方法可以做到这一点。 通常的方法使用递归,记忆或充满活力的节目。 主题演讲是,您生成一个大小为1的所有字符串的核对表,在每个模型中,对于在最后一个模型中生成的所有字符串,将该字符串与字符串中的每个个体连接起来。 (下面列出的代码中的变量索引跟踪最后一个模型的开始以及下一个模型)

一些伪代码:

list = originalString.split('')
index = (0,0)
list = [""]
for iteration n in 1 to y:
  index = (index[1], len(list))
  for string s in list.subset(index[0] to end):
    for character c in originalString:
      list.add(s + c)

你肯定会在那之后删除所有大小小于x的字符串,它们将是清单中的第一个(x-1)* len(originalString)访问。

0
2019-05-07 16:58:26
资源