【JAVA】PAT 乙级 1040 有几个PAT

【JAVA】PAT 乙级 1040 有几个PAT


题目链接

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

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

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

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

输入样例:
APPAPT

输出样例:
2

一开始没整明白怎么做,后来去网上查了下别人的思路,也没想明白。
后面思考了很久才明白为什么要这么做,举个例子,如果一堆字符,里面只有pta三种字符,其中有x个P,y个A,z个T,问有多少种方式组合成“PAT”,答案是x*y*z种。

而这道题的过程就是求x*y*z,设三个数,cp,ca,ct分别代表P的数量,PA组合的数量,PAT组合的数量

x很好理解,从左往右,出现了多少个P,x就是多少,cp也就是多少。

y不好求,拿样例来说,我们很容易看出y应该是1,但是如果是AAAPAPAATTPAATPTPAAATPAAAAPPTAAATPAPAPTA(我随便打的)那么y应该是多少这个确实不好求,似乎也没有一个通式来表达。

但是x*y,也就是P和A总共有多少种组合我们可以求出来,那刚刚随便打的那个样例,当扫描到第一个P的时候,cp=1,继续扫描到下一个A,此时显而易见只有一种组合P1A1,继续到第二个P,此时cp=2,继续扫描到下一个A,此时有三种组合,其实就是P1A1 加上 P1A2P2A2,一共三种组合,继续扫描到下一个A,此时的组合为P1A1P1A2P2A2 加上 P1A3P2A3
发现规律了吗?当扫描到A的时候,P和A组合的数量为已有的PA组合的数量,再加上当前P的数量,即ca=ca+cp。对于T也是同理,ct=ca+cp

以上是我的理解,如果有错误的地方欢迎各位读者指正。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		char[] s = bf.readLine().toCharArray();
		int cp = 0, ca = 0, ct = 0;
		for (int i = 0; i < s.length; i++) {
			if (s[i] == 'P') {
				cp++;
			} else if (s[i] == 'A') {
				ca = (ca + cp) % 1000000007;
			} else {
				ct = (ct + ca) % 1000000007;
			}
		}
		out.print(ct);
		out.flush();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值