您好,欢迎来到刀刀网。
搜索
您的当前位置:首页暗黑字符串

暗黑字符串

来源:刀刀网

题目:

一个只包含’A’、’B’、’C’的字符串,如果存在一段长度为3的连续子串中,恰好有’A’、’B’、’C’各有一个,那么这个字符串就是纯净字符串,否则这个字符串是暗黑的。
例如:BAACAACCBAAA这个字符串就是暗黑的。例如:
BAACAACCBAAA这个字符串就是纯净的,因为其连续子串中包含了’C’、’B’、’A’各一个。

你的任务就是计算出长度为n的字符串(包含’A’、’B’、’C’),有多少个是暗黑的字符串。

比如输入:
2
3
输出:
9
21

分析:
说实话,一开始没怎么看懂题目意思。再仔细看求长度为n的字符串,有多少个暗黑字符串。而相对的纯净字符串是连续为3的字符串中,分别有ABC三个不同的字符。
因此理解:
n=1的时候,一定有 A、B、C三种
n=2的时候,有AA,AB,AC,BA,BB,BC,CA,CB,CC 这九种。
n=3的时候,可以用 3^3 - (ABC的全排列) = 21
那n=4的时候呢? 就必须具体分析,得到相应的规律。
当字符串为n的时候:
f(n) 表示暗黑字符串的个数。
s(n) 表示最后两位相同的黑暗字符串个数
d(n)表示最后两位不同的暗黑字符串个数

得出 f(n) = s(n)+d(n)

继续考虑f(n)与f(n-1)的关系,才能得出递推式
s(n-1)的后两位一定是相同的,因此新加入的一位可以是ABC任意一个!!

d(n-1)的后两位是不同的,因此新加入的一位,一定要是后两位其中之一

如 xxxAB, 要保证加入一位依然是暗黑字符串,那么只能选择前面的两位之一 xxxABA, xxxABB 两种情况

f(n) = 3s(n-1)+2d(n-1) = 2f(n-1)+s(n-1)

继续分析,s(n-1) 表示后两位相同,因此等同于 s(n-1) 只有后一位,因此等于f(n-2).

f(n) = 2f(n-1)+f(n-2)

代码如下:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long[] memo = new long[31];
        memo[1] = 3;
        memo[2] = 9;
        memo[3] = 21;
        for(int i = 4; i < 31; i++){
            memo[i] = 2*memo[i-1] + memo[i-2];
        }
        int n = 0;
        while(scanner.hasNext()){
            n = scanner.nextInt();
            System.out.println(memo[n]);
        }
    }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务