【问题标题】:Find Number of combinations possible查找可能的组合数
【发布时间】:2015-02-26 16:02:20
【问题描述】:

有两个字母“X”和“Y”。需要用这两个字母组成一个长度为 N 的字符串。

当 N 应该以“Y”开头并且没有两个或更多连续的“X”时,可能有多少种组合?

考虑N = 7

我通过以下方式解决了这个问题:

我的解决方案

[没有。以字母“Y”开头的组合数] -[No:包含两个连续 X(n-1 种可能性)的组合数+ No:包含 3 个连续 X(n-1 种可能性)的组合数+.....] em>

=Math.pow(2,N-1)-[(N-2)(N-1)/2];

问题在于我要减去的部分。我缺少在字符串中包含两个连续“X”和总共 3 个 X 的元素。同样连续 2 个,总共 4 个 X。 我想找到一个通用公式来查找不会出现“R”或更多连续“X”的字符串。

请帮我找到解决办法。

【问题讨论】:

  • 这听起来更适合math.stackexchange.com
  • 这是理论上的还是您可以发布一些代码进行测试?
  • 代码将是单个语句来计算上面写的组合。 @JNYRanger
  • 谢谢@Jon 我不知道这个。将在那里发布。
  • 我投票结束这个问题,因为它应该属于 math.stackexchange.com

标签: java math combinations permutation


【解决方案1】:

对于R = 1,类似于斐波那契。

F(0) = F(1) = 1
F(N) = F(N-1) + F(N-2)

Java 中的最佳解决方案。

static int func(int n) {
    if (n < 1) return 0;   // as you required, F(0) = 0
    int n1 = 1, n2 = 1;    // however, for F(2..) we must have F(0) = 1
    for (int i = 2; i <= n; i++) {
        int n0 = n1 + n2;
        n2 = n1;
        n1 = n0;
    }
    return n1;
}

要将R 的解决方案概括为允许的连续'X' 字符数,您只需简单地将序列中的R + 1 前面的元素相加即可。正如我们所见,对于R = 1,公式为F(N) = F(N-1) + F(N-2);现在R = 2 的公式是F(N) = F(N-1) + F(N-2) + F(N-3)

因此我们派生了一个函数,它接受任何NR

static int func(int n, int r) {
    if (n < 1) return 0;   // as you required, F(0) = 0
    if (n == 1 || r < 1) return 1;
    int[] a = new int[r + 1];
    a[r] = a[r-1] = 1;     // however, for F(2..) we must have F(0) = 1
    for (int i = 2; i <= n; i++) {
        int x = a[0];
        for (int j = 1; j <= r; j++) {
            x += a[j];
            a[j-1] = a[j];
        }
        a[r] = x;
    }
    return a[r];
}

【讨论】:

  • func(3) 返回 4 但它必须是 3 使得 YXYYYYYYX
  • @gknicker YXX 不是有效序列,因为它有两个连续的X
  • 好的,谢谢,我看错了 - 改变了我的答案 - 解决方案只是一个修改后的斐波那契
  • @gnicker 重复对我来说似乎是正确的,但 func(0) 必须返回 0 而不是 1,因为当 n 为零时,我们不能有以 Y 开头的组合。
  • 感谢您的回复。这是没有两个或更多连续组合的组合。如果我必须概括为“R”或更多连续的“X”?
猜你喜欢
  • 2023-03-20
  • 2014-06-03
  • 1970-01-01
  • 2011-08-10
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多