PAT-basic-1040 有几个PAT

一、题目


字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

现给定字符串,问一共可以形成多少个 PAT

输入格式:

输入只有一行,包含一个字符串,长度不超过,只包含 PAT 三种字母。

输出格式:

在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:

APPAPT

输出样例:

2

二、解析


朴素的遍历,以A为分界点,每次遇到A,就 统计A左边的P的个数,并统计A右边的T的个数。相乘即可得到这个A能组成的PAT的个数,累加即可。但是会超时。

换个思路,不能每次遇到一个A就重新来,可以先遍历一次字符串,得到T的总个数,之后每遇到一个T,TCount--,遇到一个P,PCount++,遇到一个A就计算一次,这样总共就只用遍历两次。

三、代码


java会超时:

查看代码
 package org.example.shuati;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;

public class PAT_basic_1040 {
    private static Scanner input = new Scanner(System.in);
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        String str = br.readLine();
        int num = 0;
        int leftP = 0, rightT = 0;
        ArrayList<Integer> middleAList = new ArrayList<>();
        int len = str.length();
        for(int i=0; i<len; i++){
            char ch = str.charAt(i);
            if(ch == 'A'){
                leftP = 0;
                rightT = 0;
                for(int j=0; j<i; j++){
                    char temp = str.charAt(j);
                    if(temp == 'P'){
                        leftP ++;
                    }
                }
                for(int j=i+1; j<len; j++){
                    char temp = str.charAt(j);
                    if(temp == 'T'){
                        rightT++;
                    }
                }
                num += leftP*rightT;
                num %= 1000000007;
            }
        }
        System.out.print(num);
    }
}

c++也会超时:

查看代码
 //
// Created by yaodong on 2023/3/23.
//
#include <cstring>
#include "iostream"
int main(){
    char str[100001];
    scanf("%s", str);
    int num = 0;
    int leftP = 0, rightT = 0;
    int len = 0;
    for (int i=0; str[i] != '\0'; i++){
        char ch = str[i];
        if(ch == 'A'){
            leftP = 0;
            rightT = 0;
            for(int j=0; j<i; j++){
                char temp = str[j];
                if(temp == 'P')
                    leftP++;
            }
            for(int j=i+1; str[j] != '\0'; j++){
                char temp = str[j];
                if(temp == 'T')
                    rightT++;
            }
            num += leftP * rightT;
            num %= 1000000007;
        }
    }
    printf("%d", num);
}

 

java AC:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    private static Scanner input = new Scanner(System.in);
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        String str = br.readLine();
        int num = 0;
        int rightT = 0;
        int leftP = 0;
        int len = str.length();
        for(int i=0; i<len; i++){
            if(str.charAt(i) == 'T')
                rightT++;
        }
        for (int i = 0; i < len; i++) {
            char ch = str.charAt(i);
            if(ch == 'P') leftP++;
            if(ch == 'T') rightT--;
            if(ch =='A'){
                num += leftP*rightT;
                num %= 1000000007;
            }
        }
        System.out.print(num);
    }
}

 

posted @ 2023-04-21 00:58  正明小佐  阅读(13)  评论(0编辑  收藏  举报