暴力必超时。
思路很简单:
循环遍历字符串数组,对于每个‘A’,其能组成的PAT个数,取决于左边的'P'的个数和其右边的‘T’的个数,乘起来累加求和即可得出最终解。
该算法两次遍历数组,复杂度为O(n),耗时6ms。
第一次遍历是要求出数组中T的个数,
第二次遍历就是正式的计算。
计算方式:如果是‘P’,那么P的数量(最开始是0)加1,
如果是‘T’,那么T的数量(第一次遍历已算出)减一,
如果是‘A’,则用T的数量 * P的数量,累加到result上。
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define num 1000000007
int main()
{
int p_count,t_count,result;
p_count = t_count = result = 0;
char str[100010];
scanf("%s",str);
int len = strlen(str);
for(int i=0;i<len;i++)
{
if(str[i] == 'T')//求T的个数
t_count++;
}
for(int i=0;i<len;i++)
{
if(str[i] =='P')
p_count++;
else if(str[i] == 'T')
t_count--;
else
{
result += p_count*t_count;
result = result % num;
}
}
printf("%d",result);
return 0;
}