您的位置:首页 > 编程语言 > Python开发

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

2017-03-28 13:07 281 查看

题目描述

如下是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 编程 网易