1040 有几个PAT (25分)(Java 题解)

1040 有几个PAT (25分)



原题链接:传送门

一、题目:

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

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

输入格式:

输入只有一行,包含一个字符串,长度不超过10^5​​ ,只包含 P、A、T 三种字母。

输出格式:

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

输入样例 1:
APPAPT
输出样例 1:
2


二、解析:

思路:

方法1.数P和T中间有几个A,有几个A就是几次,再找下一个T。T没有了再找下一个P (循环太多,时间复杂度太高)。

方法2.先找到A。从A位置开始数A前面有几个P和后面有几个T。数出A前后P和T的个数,然后P和T个数相乘则是当前A可以形成的PAT数,然后再找下一个A。(运行次数太多,还是运行超时)

方法3 .如下。
  同样是找出当前A前面P的个数和后面T的个数,但是在找A之前就把T的总数(countT)找出来(假设A后面全是T)。在找A的同时如果找到的是P,则把P的个数算出来,如果是A则直接计算当前A可以组成的PAT总数,如果是T则代表A后面的T要比假设的T少一个。

AC代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 1040 有几个PAT (25分)
 * 
 * @author: ChangSheng
 * @date: 2019年12月12日 下午9:32:38
 */
public class Main {
     
	public static void main(String[] args) throws IOException {
     
		// 方法3.同样是找出当前A前面P的个数和后面T的个数,但是在找A之前就把T的总数(countT)找出来(假设A后面全是T)。
		// 在找A的同时如果找到的是P,则把P的个数算出来,如果是A则直接计算当前A可以组成的PAT总数,如果是T则代表A后面的T要比假设的T少一个。
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String line = in.readLine();
		int result = 0;
		int countT = 0; // 假设A后面全是T
		for (int i = 0; i < line.length(); i++) {
     
			if (line.charAt(i) == 'T') {
     
				countT++;
			}
		}
		int countP = 0;
		for (int i = 0; i < line.length(); i++) {
     
			if (line.charAt(i) == 'P') {
     
				countP++;
			} else if (line.charAt(i) == 'A') {
      // 查找到A
				result = result + countP * countT;
				result = result % 1000000007;
			} else if (line.charAt(i) == 'T') {
     
				countT--; // 没找到A但是找到了T,那么A后面T的个数减一
			} 
		}
		System.out.print(result);
	}
}
方法2超时思路代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 1040 有几个PAT (25分)
 * 
 * @author: ChangSheng 
 * @date:   2019年12月12日 下午9:32:38
 */
public class Main {
     
	public static void main(String[] args) throws IOException {
     
		
		// PPAATT
		// 方法1.数P和T中间有几个A,有几个A就是几次,再找下一个T。T没有了再找下一个P(循环太多,时间复杂度太高)。
		// 方法2.先找到A。从A位置开始数A前面有几个P和后面有几个T。数出A前后P和T的个数,然后P和T个数相乘则是当前A可以形成的PAT数,然后再找下一个A。(java运行超时)
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String line = in.readLine();
		int total = 0;
		for (int i = 0; i < line.length(); i++) {
     
			// 找到A
			if (line.charAt(i) == 'A') {
     
				// 数A前面有几个P和后面有几个T
				int countP = 0;
				int countT = 0;
				for (int j = i; j >= 0; j--) {
     
					if (line.charAt(j) == 'P') {
     
						countP++;
					}
				}
				for (int j = i; j < line.length(); j++) {
     
					 if (line.charAt(j) == 'T') {
     
						 countT++;
					 }
				}	
				// 数出A前后P和T的个数,然后P和T个数相乘则是当前A可以形成的PAT数。
				total = (total + countP*countT) % 1000000007;
			}
			
		}
		System.out.println(total);
	}
}

相关

PAT - 乙级 - 题解集

你可能感兴趣的:(#,PTA题解,pintia)