1、题目链接

https://www.patest.cn/contests/pat-a-practise/1093

2、题意分析

(1)题意:分析一个字符串中拥有多少个不重复的PAT

(2)分析:有两种思路。

1)我们可以从头到尾依次遍历一个字符串,如果当前字符等于P,则再从当前位置遍历,找出字符A,然后再在字符A的基础上找出字符T,累计这样的次数,最后取余,得到最后的一个答案。

2)同时,我们可以找出这个字符串中每个A前面有多少个P,后面有多少个T。根据排列与组合原理,可知每个字母A可以组成的PAT有sumP*sumT个,然后将这些sumP*sumT累加,然后取余,得到答案。

3、第一种方法代码如下:

#include <stdio.h>
#include <string.h>
/*
1.使用全局变量可以扩大数组范围 
*/
#define size  100001
	
int main(){
	char string[size];//存储字符串 
	
	scanf("%s",string);//输入字符串
	int length;
	length = strlen(string);//求出字符串的长度
	//printf("%d",length);
	 
 	int i, j ,k ;	
 	int total  = 0;//用来表示有多少个pat 
	//遍历 
	for(i = 0;i<length;i++){
		if(string[i] == 'P'){//如果开头一个字符为p 
			for(j = i+1;j<length;j++){
				if(string[j] == 'A'){//如果后面一个数为A 
					for(k = j+1;k<length;k++){
						if(string[k] == 'T'){
							total++;
							total %= 1000000007;
						} 
					}
				}
			}			
		}
	} 
	printf("%d",total);
}

/*
APPAPT

PAT
**/
但是上交测试之后发现时间超过,因为我们使用了三次循环,导致时间超过,所以这里推荐使用第二种方法,代码如下:

#include <stdio.h>
#include <string.h>
/*
1.使用全局变量可以扩大数组范围 
*/
#define size  100001
	
int main(){
	char string[size];//存储字符串 
	
	scanf("%s",string);//输入字符串
	int length;
	length = strlen(string);//求出字符串的长度
	//printf("%d",length);
	 
 	int i, j ,k ;	
 	int total  = 0;//用来表示有多少个pat 
	int sumP = 0,sumT = 0;//表示字符A前P 与后T的数目 
	int array[size][2] ,index = 0;
	//遍历 
	for(i = 0;i<length;i++){
		if(string[i] == 'A'){
			array[index++][0]  = sumP;
		} 
		if(string[i] == 'P'){
			sumP++;//如果为字符P,则加一 
		}
	}
	//index为字符串中A的数目 
	int temp = index; 
	for(i = length - 1;i >= 0;i--){
		if(string[i] == 'A'){
			array[--index][1]  = sumT;
		} 
		if(string[i] == 'T'){
			sumT++;//如果为字符P,则加一 
		}
	}  
	
	for(i = 0;i<temp;i++){
	//	printf("%d %d\n",array[i][0] ,array[i][1]);
		total += (array[i][0] * array[i][1]);
		total %= 1000000007;
	}
	printf("%d",total);
}

/*
APPAPT

PAT

ATPAPAPAT
**/