题目描述
如下是16年网易秋招的笔试编程题
一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串
你的任务就是计算出长度为n的字符串(只包含'A'、'B'和'C'),有多少个是暗黑的字符串。
输入描述:
输入一个整数n,表示字符串长度(1 ≤ n ≤ 30)
输出描述:
输出一个整数表示有多少个暗黑字符串
输入例子:
2 3
输出例子:
9 21
思路及Python实现
这种有一些复杂的题目,可以通过状态转移方程推导出来,这在算法中是很常见的。简单举个大家都很熟悉栗子~,斐波那契数列:
1 + 1 = 2;
1 + 2 = 3;
2 + 3 = 5;
3 + 5 = 8;
5 + 8 = 13;
...
当然我们很容易知道,F(N) = F(N-1) + F(N-2)
在本例中,道理也是一样的。直接考虑黑暗字符串的情形。我们可以将两个字符串相等的情况记为S(n),将两个字符串不等的情况记为D(N);现在我们假设在第 i 状态时可能的情况有F(i) = S(i) + D(i),那么在下一个状态(i + 1)时,S(i)的情况为S(i+1) = S(i) + D(i),D(i+1) = 2 * S(i) + D(i),还是用个栗子来说明:
如: AA --> AAA,
AA --> AAB,
AA --> AAC;
AB --> ABB,
AB --> ABA
到这儿,大家已经知道如何解决啦吧,啊哈哈哈~~~ i + 1状态时的情况
F(i+1) = S(i+1) + D(i+1) = S(i) + D(i) + 2 * S(i) + D(i) = 2 * F(i) + S(i) = 2 * F(i) + F(i-1)
至此,递推结果显而易见了:F(n) = 2 * F(n-1) + F(n-2)
OK,最后照例附上Python实现
#encoding:utf-8
def str_num(n):
n = int(n)
if n == 1 :
return 3
if n == 2 :
return 9
if n >= 3:
return 2 * str_num(n-1) + str_num(n-2)
n = input()
print str_num(n)
更多样例
更多样例请看这里哟:http://blog.csdn.net/buracag_mc/article/category/6817874