[编程题] 暗黑的字符串
一个只包含'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
解题思路:
以为找规律,其实也是一种动态规划.而且还是一种典型的数论动态规划.
假设: 长度为n的字符串. 通过前面n-1长度的字符串来推到.
假设: f(n - 1) = S(n - 1) + D(n - 1); f:表示n-1长的黑暗字符串数 , S:表示n-1长的黑串结果中后两位相同的数目 D:后两位不同的数目; 为啥这么设,从n-1开始设方程,是为了通过f(n-1)来表示f(n)
观察变化过程: 1.S: eg:"AA" -> 增加1位结果:AAA AAB AAC 2.D: eg:"AB" -> 增加1位结果:ABA ABB target. f(n) = 3*S(n - 1) + 2*D(n - 1) = 2*f(n - 1) + S(n - 1); 发现S(n - 1)并不知道, 我们就在往前看一步,试着找出 f(n - 2)与 S(n - 1)之间的关系.好吧,其实一开始并不知道与谁的关系 总之要找S与别的变量的关系.
推导: 依据假设,有:f(n - 1) = S(n - 1) + D(n - 1); 3.每个S(n - 1)都能够得到3个结果,根据1.知 其中的一个 是 S状态的(S(n))AAA 4.每个D(n - 1)都能够得到2个结果,根据2.知 其中的一个 是 S状态的(S(n))ABB 根据 3. 4. 得到: 5. S(n) = S(n - 1) + D(n - 1); 根据假设与5. 可以得到 f(n - 1) = S(n) 推到得到: S(n - 1) = f( n - 2 ); 带入 target.得到 f(n) = 2*f(n - 1) + f(n - 2);