字符串
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
解题思路:
代码1用的暴力破解,用的3层for循环,此时的时间复杂度就会很高,后面三个测试点都会超时。
显然,在经过分析样例之后,我们能得出这样的结论:题目给出的字符串,APPAPT,第二个A在中间,那么它前面所有的P都能和这个A组成PA,A和T也同理。所以只需遇到一个P就cnt_p++,然后在遍历到A时,将P出现的次数赋给cnt_a;最终的的数目为cnt+=cnt_a这样只需循环一遍就能得出结果。得出的代码2就能通过全部测试点。
代码1:
#include <stdio.h>
#include <string.h>
int main(){
char str[100001];
int cnt=0;
gets(str);
for(int i=0;i<strlen(str);i++){
if(str[i]=='P'){
for(int j=i+1;j<strlen(str);j++){
if(str[j]=='A'){
for(int k=j+1;k<strlen(str);k++){
if(str[k]=='T')
cnt++;
}
}
}
}
}
printf("%d",cnt);
}
代码2:
#include <stdio.h>
#include <string.h>
int main(){
char str[100001];
int cntp=0,cntpa=0,cnt=0;
gets(str);
for(int i=0;i<strlen(str);i++){
switch(str[i]){
case 'P':
cntp++;
break;//A前面中P的个数
case 'A':
cntpa+=cntp;
break;//T前面PA的个数
default:
cnt+=cntpa;
}
if(cnt>1000000007){
cnt=cnt%1000000007;
}
}
printf("%d",cnt);
}