PAT 1040 有几个PAT

回溯  超时写法

#include<cstdio>
#include<cstring>
char str[4]="PAT";
char input[100010]={'\0'};
int count=0;
void backtrack(int i, int j, int n) {  
    if (j == 3) { // 找到了一个 "PAT" 子序列
        count = (count + 1) % 1000000007;
        return;
    }

    if (i >= n) {
        return; // 超出字符串长度,结束回溯
    }

    // 选择当前字符
    if (input[i] == str[j]) {
        backtrack(i + 1, j + 1, n);
    }

    // 不选择当前字符
    backtrack(i + 1, j, n);
}
int main(){
    scanf("%s", input);
    int n = strlen(input);
    // dfs(0,0,n);
    backtrack(0,0,n);
    printf("%d\n", count);
}

常见写法:

#include<cstdio>
#include<cstring>
#define MOD 1000000007
char input[100010]={'\0'};
int leftPNum[100010]={0};
int main(){
    scanf("%s", input);
    int n = strlen(input);
    for(int i=0;i<n;i++){ // 第i位及左边字符共包含了几个P
        if(i>0&&input[i]=='P'){
            leftPNum[i]=leftPNum[i-1]+1;
        }else
            leftPNum[i]=leftPNum[i-1];
        if(i==0&&input[i]=='P'){
            leftPNum[i]=1;
        }
    }
    int ans = 0;
    int rightTNum=0;
    for(int i=n-1;i>=0;i--){
        if(input[i]=='T')
            rightTNum++;
        if(input[i]=='A')
            ans=(ans+leftPNum[i]*rightTNum)%MOD;
        //💕💕💕 ans+=(leftPNum[i]*rightTNum)%MOD; 是错的!!!
    }
    printf("%d\n", ans);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值