PAT-basic-1040 有几个PAT
一、题目
字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 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);
}
}