题目描述
字符串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); } }