【问题标题】:Do not know where I'm wrong in the task不知道我在任务中哪里错了
【发布时间】:2016-10-04 07:54:15
【问题描述】:

对于某些 n,我们必须确定仅由“0”和“1”组成的不同字符串的数量,其中没有两个相邻的“1”。(字符串大小为 n)抱歉我的英语不好。 这是我的尝试:

long Num(int n){
    if(n==0)
        return 0;
    else if(n==1)
        return 2;
    else if(n==2)
        return 3;
    else if(n==3)
        return 5;
    else
        return 2*Num(n-2) + Num(n-3);
};

【问题讨论】:

  • 您可以发布一些输入示例、预期输出和实际输出。
  • 您的问题需要具体说明......您遗漏了很多细节。

标签: arrays string recursion


【解决方案1】:

问题:

找出可能的长度为 n 且没有连续 1 的二进制字符串的数量。

输入/输出:

输入:N = 2 输出:3 // 3 个字符串分别是 00, 01, 10

输入:N = 3 输出:5 // 5个字符串分别是000, 001, 010, 100, 101

方法:

令 a[i] 为长度为 i 且不包含任何两个连续 1 且以 0 结尾的二进制字符串的数量。同样,令 b[i] 为以 1 结尾的此类字符串的数量。我们可以将 0 或 1 附加到以 0 结尾的字符串,但我们只能将 0 附加到以 1 结尾的字符串。这会产生递归关系:

a[i] = a[i - 1] + b[i - 1]
b[i] = a[i - 1] 

上述递归的基本情况是a[1] = b[1] = 1。长度为i的字符串总数只是a[i] + b[i]。使用数组 i(字符串长度)时,对于数组的零位置,将减少 1。

解决办法:

int countStrings(int n)
{
    int a[] = new int [n];
    int b[] = new int [n];
    a[0] = b[0] = 1;
    for (int i = 1; i < n; i++)
    {
        a[i] = a[i-1] + b[i-1];
        b[i] = a[i-1];
    }
    return a[n-1] + b[n-1];
}

更多详情见http://www.geeksforgeeks.org/count-number-binary-strings-without-consecutive-1s/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多