【Python】 网易笔试编程题(暗黑字符串)

题目描述

如下是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值