版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LightInDarkness/article/details/82917964
字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
分析:
方法一:遍历字符串,找出T的数量。从头开始再对字符串进行一次遍历,遇到P统计当前P的数量,遇到T统计该字符之后T的数量,遇到A计算每个A可组成PAT的数量,即:P * T,累计即可。
#include<iostream>
using namespace std;
int main(){
int pos = 0, cnt = 0;
int P = 0, T = 0;
string s;
cin >> s;
for(int i = 0; i < s.length(); i++)
if(s[i] == 'T') T++;
for(int i = 0; i < s.length(); i++){
if(s[i] == 'P') P++;
else if(s[i] == 'T') T--;
else if(s[i] == 'A') cnt += P * T;
cnt %= 1000000007;
}
cout << cnt;
}
方法二:要统计PAT的数量,就需要知道当前T之前PA的数量;要知道PA的数量,就需要知道当前A之前P的数量。那么遇到P,则P++;遇到A,则PA += P;遇到T,PAT += PA。
#include <iostream>
using namespace std;
int main(){
char c;
int p = 0, pa = 0, pat = 0;
while(scanf("%c", &c) && c!=' ' && c!='\n') {
if(c == 'P') {
p++;
}else if(c == 'A') {
pa += p;
pa = pa;
}else{
pat += pa;
pat = pat % 1000000007;
}
}
printf("%d\n", pat);
return 0;
}