1040 有几个PAT (25分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
样例解答1(超时):
直接三个循环试一下,不出所料的超时了。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char[] c = bf.readLine().toCharArray();
bf.close();
long num=0;
for(int i=0;i<c.length-2;i++) {
if(c[i]!='P') continue;
for(int j=i+1;j<c.length-1;j++) {
if(c[j]!='A') continue;
for(int k=j+1;k<c.length;k++) {
if(c[k]!='T') continue;
else {
num++;
num%=1000000007;
}
}
}
}
System.out.print(num);
}
}
样例解答2:
PAT的个数等于:每次找到A时,该A之前P的个数乘之后T的个数。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char[] c = bf.readLine().toCharArray();
bf.close();
int p=0,a=0,t=0,num=0;
//求出T的总数
for(int i=0;i<c.length;i++) {
if(c[i]=='T') t++;
}
//p++得出A之前P的个数,t--得出A之后T的个数
for(int i=0;i<c.length;i++) {
if(c[i]=='P') p++;
else if(c[i]=='T') t--;
else{
num+=p*t;
num%=1000000007;
}
}
System.out.print(num);
}
}
样例解答3:
查阅一番,又找到了其他方法。
从后往前读,记录T,AT,PAT的个数。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
char[] c = bf.readLine().toCharArray();
bf.close();
int pat=0,at=0,t=0;
for(int i=c.length-1;i>=0;i--) {
if(c[i]=='T')
t++;
else if(c[i]=='A')
at=(t+at)%1000000007;
else
pat=(pat+at)%1000000007;
}
System.out.print(pat);
}
}