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

现给定字符串,问一共可以形成多少个PAT?
输入描述:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。

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

输入例子:
APPAPT

输出例子:
2

刚开始想用动态规划,但是使用起来却复杂了,看了推荐答案后,自愧不如。核心求pat的组成方式是叠加的,所以每遇到T的时候,pat都要增加一次,然而增加的次数却是pa的组成总次数。
然而每次遇到a。pa的组合总次数就要加一次。增加的次数为到当前位置P的总次数。很巧妙的动态规划。代码如下:(仅限牛客ac)

import java.util.Scanner;

public class pat30 {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
char c[]=str.toCharArray();
long p=0,pa=0,pat=0;
for(int i=0;i<c.length;i++)
{
if(c[i]=='P') {
p++;
}else if(c[i]=='A') {
pa+=p;
}else {
pat+=pa%1000000007;
}
}
System.out.println(pat%1000000007);
}
}