暗黑字符串

题目:

一个只包含’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任意一个!!

如 xxxAA ,由于s(n-1)本身已经是暗黑字符串,就不用考虑前面了,只需要考虑最后两位,再加入一位使得字符串依旧是暗黑字符串,xxxAAB, xxxAAA,xxxAAC 有三种情况

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]);
        }
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值