求满足条件的长度为N的字符串的个数(斐波那契数列)

来源:互联网 发布:卡西欧授权的淘宝网店 编辑:程序博客网 时间:2024/06/05 21:06

今天做到了一道题目,初看时愣了一下,回过头在做的时候忽然发现其实是斐波那契数列。

原题大概是这样的:

条件1:字符串只包含‘0’或 ‘1’;
条件2:字符串只能以‘1’开始;
条件3:字符串不能够包含‘00’的组合;
问:长度为N的字符串的合法的组合到底有几种可能性?

解:

这里先记录一下自己的思考过程:
字符串起始只能是‘1’,所以实际上就是问(长度为N-1的字符串全部的组合数-包含‘00’的组合数)的大小;
考虑‘00’组合的个数进行组合,感觉之后处理会比较麻烦,就断了这个想法。

我们先写出长度为N的字符串的可能的组合数量:

len = 1(1)output: 1len = 2(10, 11)output: 2len = 3(101, 110, 111)output: 3len = 4(1010, 1011, 1101, 1110, 1111)output: 5

其实写到这里,我们大致已经发现了规律:F(N) = F(N - 1) + F(N - 2)

证明:
假设,长度为N所有合法的字符串中,末尾为‘0’的字符串的个数为x,末尾为‘1’的字符串的个数为y;
F(N) = x + y;

则,此时长度为N + 1的所有合法的字符串中,末尾为‘0’的字符串只能从长度为N的末尾为‘1’的字符串变化而来才是合法的,所以长度为N + 1的合法字符串中末尾为‘0’的字符串的个数为y;末尾为1的字符串个数为x + y;
F(N + 1) = x + 2 * y;

此时长度为N + 2的所有合法的字符串中,末尾为‘0’的字符串只能从长度为N + 1的末尾为‘1’的字符串变化而来才是合法的,所以长度为N + 2的合法字符串中末尾为‘0’的字符串的个数为 x + y;末尾为1的字符串个数为x + 2 * y;
F(N + 2) = 2 * x + 3 * y;

在数值上可以得到:F(N + 2) = F(N + 1) + F(N)

证毕。

0 0
原创粉丝点击