题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805373582557184
康复训练做题。
题意:找出给出的字符串中PAT的数量,只要求P在A前,A在T前。
想了想肯定是要用O(N)的算法做的,不然铁定超时,即扫描一遍就做出来。
思路是从后往前扫描字符串
- 如果是
T就记录当前T的数量(numT++) - 如果是
A,可以开始凑组合AT了,记录当前AT组合的数量(numAT++) - 如果是
P,恭喜,可以开始计算【由这个P组成的】PAT个数了,实际上就是让总数加上当前AT组合的数量
完整代码
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<string.h>
using namespace std;
const int C = 1000000007;
int main() {
string str;
cin >> str;
int ret = 0, numT = 0, numAT = 0;
vector<int> rem(str.size(), 0);
for (int i = str.size() - 1; i >= 0; i--) {
if (str[i] == 'T') {
numT++;
}
else if (str[i] == 'A') {
numAT += numT;
}
else if (str[i] == 'P') {
ret += numAT;
ret %= C;
}
}
printf("%d", ret);
return 0;
}
本文介绍了如何解决一道关于字符串中PAT计数的问题。利用O(N)时间复杂度的算法,从后往前扫描字符串,记录T、AT的数量,在遇到P时计算PAT组合。核心代码展示并解释了每一步操作,适合编程训练和算法理解。

536

被折叠的 条评论
为什么被折叠?



