PAT basic level 1040有几个PAT

写之前就知道要超时了,三层嵌套不超都难,但也想不到解决办法,时间复杂度为 O(n^3)

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    cin>>s;
    int count=0;
    for(int i=0;i<s.length();i++){
        if(s[i]=='P'){
            for(int j=i;j<s.length();j++){
                if(s[j]=='A'){
                    for(int h=j;h<s.length();h++){
                        if(s[h]=='T'){
                            count++;
                        }
                    }
                }
            }
        }
    }
    cout<<count<<endl;
    return 0;
}

下面是AI跑的神仙代码,属实秀我一脸,值得反复琢磨学习

#include <iostream>
using namespace std;

int main() {
    string s;
    cin >> s;
    const int MOD = 1000000007;
    long long countP = 0, countPA = 0, countPAT = 0;

    for (int i = 0; i < s.length(); i++) {
        if (s[i] == 'P') {
            countP++;
        } else if (s[i] == 'A') {
            countPA = (countPA + countP) % MOD;
        } else { // 'T'
            countPAT = (countPAT + countPA) % MOD;
        }
    }

    cout << countPAT << endl;
    return 0;
}

可能会比较难懂,这里我简单分析一下:

在给定的问题中,我们需要统计字符串中包含多少个 PAT。为了实现这一目标,在代码中我们使用了三个计数器变量:countPcountPA 和 countPAT

  • countP 统计字母 ‘P’ 的数量。
  • countPA 统计字母 ‘A’ 前面有多少个 ‘P’。例如,对于字符串 “APAT”,countPA 的值为 1。
  • countPAT 统计字母 ‘T’ 前面有多少个 ‘PA’。例如,对于字符串 “APAT”,countPAT 的值为 1。

在代码的遍历循环中,我们从字符串的第一个字符开始,根据当前字符的类型进行不同的操作:

  • 如果当前字符是 ‘P’,我们将 countP 加一,表示找到了一个 ‘P’。
  • 如果当前字符是 ‘A’,我们将 countP 的值加到 countPA 上,表示遇到了一个 ‘A’,并且 ‘A’ 前面有了更多的 ‘P’。
  • 如果当前字符是 ‘T’,我们将 countPA 的值加到 countPAT 上,表示遇到了一个 ‘T’,并且 ‘T’ 前面有了更多的 ‘PA’。

最后,我们输出 countPAT 的值,即字符串中包含的 PAT 数量。

这种方法的思想是,我们通过逐个检查字符,按顺序将 ‘P’、‘PA’ 和 ‘PAT’ 的数量分别累计起来。最终的 countPAT 值就是我们需要的答案。

真的相当精巧,举个例子辅助一下,PPAPPAT,先是两个P,再是一个A,这时countP=2,要加入到countPA中,意思是说第一个A前面有两个P,再到第二个A,此时countP=4,意思是说第二个A前面有4个P,也加入countPA中,那么countPA=6,意思是说所有的A 前面的P累计一共有6个,这六种情况都有希望组成PAT,这个例子的答案也就是6.

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值