【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相关文章推荐
- 网易2017秋招编程题:暗黑的字符串 [python]
- 网易编程题暗黑字符串原理解析以及Java源码
- 网易2017笔试 暗黑字符串
- (网易2018校招笔试)[编程题] 字符串碎片
- 网易2017笔试 暗黑字符串
- 网易2017春招笔试真题编程题集合--Python
- 网易编程题--暗黑的字符串
- 动态规划之网易2017年秋招编程题之暗黑的字符串
- 【Python】 网易笔试编程题(买苹果)
- 【Python】 网易笔试编程题(记单词)
- 2017网易游戏雷火盘古实习生招聘笔试真题:字符串编码 [python]
- 网易0912笔试题 暗黑字符串
- 网易编程题四,暗黑的字符串(递推计数)
- 【Python】 网易笔试编程题(数字翻转)
- 【网易笔试编程题】字符串碎片
- (网易2018校招笔试)[编程题] 字符串碎片
- python字符串split(),join(),strip()函数及网易笔试 回文序列
- 【Python】 网易笔试编程题(优雅的点)
- 【Python】 网易笔试编程题(集合)
- 网易2017校园招聘编程题——暗黑字符串