PTA跳转:原题链接
这道题目大意是输入只有"P",“A”,“T"三个字符组成的字符串,计算出字符串中有多少个"PxAxT”(其中,x表示"P",“A”,"T"这三个字符中的任何一个字符,或者为空)。
如"ATPAPAT"中就有3个"PAT",分别是[2][3][6],[2][5][6],[4][5][6]。
这道题难点在于时间限制不是往常的400ms,而是变成150ms,多重循环会超时。后来参照柳神的解题思路写出如下代码,只需要2次一重循环就可解决问题。
第一次循环的任务是把 “T” 的数量计算出来,"P"和"A"不管。
第二次循环逐个字符进行判断,刚开始时,nP为0,nT为第一次循环所得。如果如果字符串的前两个字符都是"P",则nP变为2。如果接下来的字符是"A",则result在自身的基础上加上 " nP * nT "(即这个字符"A"左边有nP个字符"P",右边有nT个字符"T")。对每个字符进行操作,直到遍历至字符串结尾。
为什么要对1000000007取模?原因
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int len = s.length(), result = 0, nP = 0, nT = 0;
for(int i = 0; i < len; i++){
if (s[i] == 'T')
nT++; //先把字符串'T'的数量计算出来
}
for(int i = 0; i < len; i++){
if(s[i] == 'P')
nP++;
else if(s[i] == 'T')
nT--;
else if(s[i] == 'A')
result = (result + (nP * nT) % 1000000007) % 1000000007; //这个'A'前面有nP个'P',后面有nT个"T"
}
cout << result;
return 0;
}
氷鸢鸢鸢
2020.2.19