写之前就知道要超时了,三层嵌套不超都难,但也想不到解决办法,时间复杂度为 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。为了实现这一目标,在代码中我们使用了三个计数器变量:countP
、countPA
和 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.