字符串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
import java.util.*;
public class Main {
static Scanner in=new Scanner(System.in);
static final int N=1000000007;
public static void main(String[] args) {
while(in.hasNext()){
String s=in.next();
int cntT=0,cntAT=0,cntPAT=0;
for(int i=s.length()-1;i>=0;i--){
if(s.charAt(i)=='T')
cntT++;
else if(s.charAt(i)=='A')
cntAT=(cntAT+cntT)%N;
else
cntPAT=(cntPAT+cntAT)%N;
}
System.out.println(cntPAT);
}
}
}
反思:PAT也是很绝了,之前我没有把 1000000007定义为常量,结果就有一个测试点超时了,表示不是很懂QAQ,好吧,还是把这个题说一下吧,思路还是很巧妙的!
倒着统计,先统计T的个数,遇到第一个A时,AT组合的个数即T的个数,若再遇到任何一个A,就相当于AT组合个数多了一倍T的个数,同理,遇到第一个P时,PAT组合的个数即AT的个数,若再遇到任何一个P,就相当于PAT组合个数多了一倍AT的个数,这样一直累加下去即可,如果还是不明白,可以自己写一个例子推理一遍过程即可
此外我附上另一种解法:
#include<bits/stdc++.h>
2 using namespace std;
3 #define mod 1000000007
4 int main(){
5 string s;
6 cin>>s;
7 int p=0,a=0,t=0;
8 for(int i=0;i<s.size();i++)
9 {
10 if(s[i]=='T')
11 t++;
12 }
13 for(int i=0;i<s.size();i++){
14 if(s[i]=='P')
15 p++;
16 if(s[i]=='T')
17 t--;
18 if(s[i]=='A'){
19 a=(a+(p*t)%mod)%mod;//关键
20 }
21 }
22 cout<<a<<endl;
23 return 0;
24 }
思路很是相似,也比较简单:先统计T的个数,在遇到第一个A之前,统计P的个数并且累加,遇到第一个A,同时要除去A之前的T的个数,明显这些T是无效的,此时PAT组合的个数即:p*T(有效的个数),此后依次类推,再遇到A就用有效P的个数乘以有效T的个数,当然别忘了取模!