字符串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
//超时
#include <iostream>
using namespace std;
int main()
{
string s;
getline(cin, s);
long long numT, numAT = 0, numPAT = 0;
for(int i = 0; i < s.size(); i ++){
if(s[i] == 'P'){ //查看每个P后AT的个数
numAT = 0;
for(int j = i+1; j < s.size(); j ++){
if(s[j] == 'A'){ //查看每个A后T的个数
numT = 0;
for(int k = j+1; k < s.size(); k ++){
if(s[k] == 'T'){
numT ++;
}
}
numAT += numT;
}
}
numPAT += numAT;
}
}
printf("%lld", numPAT%1000000007);
}
//改进后
#include <stdio.h>
#include <string.h>
int main() {
char str[100001];
gets(str);
int numT = 0;
int numAT = 0;
int numPAT = 0;
for(int i = strlen(str) - 1; i >= 0; --i) { //从字符串后面向前遍历
if(str[i] == 'T') //碰到T,记录该T后面T的总个数(包括这个T)
++numT;
else if(str[i] == 'A') //碰到A,记录该A后面AT组合的总个数;其中包括之前统计的A后面AT的总个数加上这个A与后面全部T组合的个数(即之前统计的T的总个数)
numAT = (numAT + numT) % 1000000007;
else { //碰到P,记录该P后面PAT组合的总个数;同理
numPAT = (numPAT + numAT) % 1000000007;
}
}
printf("%d", numPAT);
return 0;
}