1040 有几个PAT (25分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位( P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位 ( P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
思路都在代码注释里了,直接看代码应该更好理解
package pat_basic_level_practice;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class practice_1040 {
static long sum = 0;
static long p_before = 0;
static long cur = 0;
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
char[] letters = bfr.readLine().toCharArray();
// 先找到最后一个T
int index = 0;
for(int i = letters.length - 1;i >= 0;i--) {
// 将最后一个T的下标赋予index
if(letters[i] == 'T') {
index = i;
break;
}
}
// 若最后一个 T 的位置在2(下标)之前,则该字符串不可能形成PAT
if(index < 2) {
System.out.print(0);
return;
}
for(int i = 0;i <= index;i++) {
// 碰到'P',p_before++,表示如果以后遇到了 'A',则当前这个 'A'之前有p_before个 'P',即能形成p_before种PA
if(letters[i] == 'P') {
p_before++;
}
// 碰到'A',cur += p_before,记录当前能形成 cur 种PA
if(letters[i] == 'A') {
cur += p_before;
}
// 碰到'T', sum += cur,记录 当前 T 前面有多少种 PA(能与之组成PAT)
if(letters[i] == 'T') {
sum += cur;
}
}
System.out.println(sum % 1000000007);
}
}