美文网首页PAT
1040.几个PAT

1040.几个PAT

作者: yzbkaka | 来源:发表于2018-08-14 17:36 被阅读2次

题目描述

字符串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<stdio.h>
#include<string.h>
int main(){
    char a[100000];
    int len,i,j,k,t=0,n;
    scanf("%s",&a);
    len=strlen(a);
    for(i=0;i<len;i++){
        for(j=i+1;j<len;j++){
            for(k=j+1;k<len;k++){
                if(a[i]=='P'&&a[j]=='A'&&a[k]=='T'){
                    t++;
                }
            }
        }
    }
    n=t%1000000007;
    printf("%d",n);
    return 0;
} 

我的分析

这道题的第一反应就是暴力解决,直接用一个三重循环来按照P,A,T的顺序来找,编译的时候当然不是满分,运行超时了3个测试点,但是也得了15分,在真正考试的时候可以先把自己先想到的简单方法提交上去,尽量多的得分,如果有时间在后面可以想的全面一点。

正确代码

#include<stdio.h>
#include<string.h>
int main(){
    char a[100000];
    int len1,i=0,j=0,k=0;
    scanf("%s",a);
    len1=strlen(a);
    
    while(len1>0){
        len1--;
        if(a[len1]=='T'){
            i++;
        }
        if(a[len1]=='A'){
            j=(i+j)%1000000007;
        }
        if(a[len1]=='P'){
            k=(k+j)%1000000007;
        }
    }
    printf("%d",k);
    return 0;
} 

思路

这个算法是从后往前开始查找,先找到‘T’,然后让i加1,接着是再找到‘A’,然后让记录‘AT’的j来加上i,最后是再找到‘P’,让记录‘PAT’,的k加上j,最后输出k就可以了。

相关文章

网友评论

    本文标题:1040.几个PAT

    本文链接:https://www.haomeiwen.com/subject/hcsubftx.html