1

题目大意:

给定一个只包含P,A,T的字符串,让其计算有多少个PAT组合

算法思路:

对一个确定位置的A来说,以它形成的PAT的个数等于它左边P的些个数乘以它右边T的个数。例如对字符申APPAPT的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2x1=2.于是问题就转换为:对字符串中的每个A,计算它左边P的个数与它右边T的个数的乘积,然后把所有A的这个乘积相加,最后的结果就是该字符串中所有的PAT组合数目。那么现在就是需要获取每一个位置的左边的P和右边的T的数,在这里我们使用leftPrightP分别保存当前位置左边的P和右边的T的个数。之所以可以这样保存,是因为当前位置i左边的P的个数和i-1位置左边P的个数具有继承性,要么相等,要么相差1。那么这样我们可以先遍历一遍所有的字符串中所有的T出现的个数,然后使用ans保存所有的PAT组合数目,再次遍历字符串的过程中,如果当前字符为P那么就让leftP加1,如果为T,就让rightT减一,如果为A,就累计leftP*rightT

注意点:

1、测试点3和4考察取模,不能在最后统计完成后再取模,需要每计算一次就取模。

提交结果:

截屏2020-10-22 上午9.27.01.png

AC代码:

#include <cstdio>
#include <string>
#include <iostream>

using namespace std;

int main(){
    string s;
    cin>>s;
    int len = s.size();
    int leftP = 0;
    int rightT = 0;
    int ans = 0;//记录PAT的个数
    for (int i = 0; i < len; ++i) {
        if(s[i]=='T'){
            ++rightT;
        }
    }
    for (int j = 0; j < len; ++j) {
        if(s[j]=='P'){
            ++leftP;
        } else if(s[j]=='T'){
            --rightT;
        } else if(s[j]=='A'){
            ans += leftP*rightT;
            ans %= 1000000007;
        }
    }
    cout<<ans;
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得