注意:
1、暴力搜索会超时
思路:
1、遍历A,并记录A左边P的个数和右边T的个数,记录到数组
Python代码(自己写的,AC):
inputL = list(raw_input())
listLen =len(inputL)
pCnt=0
tCnt=0
listP=[0]*listLen
listT=[0]*listLen
idxP=0
idxT=0
for i in xrange(listLen):
if inputL[i]=='P':
pCnt+=1
elif inputL[i]=='A':
listP[idxP]=pCnt
idxP+=1
if inputL[listLen-1-i]=='T':
tCnt+=1
elif inputL[listLen-1-i]=='A':
listT[idxT]=tCnt
idxT+=1
count =0
for i in xrange(idxP):
count+=listP[i]*listT[idxP-1-i]
count%=1000000007
print count
Java代码(自己写的,思路相同,但部分超时):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
char[] arr =sc.nextLine().toCharArray();
int arrLen =arr.length;
int patCnt=0;
int[] pArr=new int[arrLen];
int[] tArr=new int[arrLen];
int cnt1 =0;
int cnt2 =0;
int pCnt=0;
int tCnt=0;
int i=0;
int j=0;
for(i=0;i<arrLen;i++){
if(arr[i]=='P'){
cnt1++;
}
else if(arr[i]=='A'){
pArr[pCnt++]=cnt1;
}
j=arrLen-1-i;
if(arr[j]=='T'){
cnt2++;
}
else if(arr[j]=='A'){
tArr[tCnt++]=cnt2;
}
}
for(i=0;i<pCnt;i++){
patCnt+=pArr[i]*tArr[pCnt-1-i];
}
patCnt%=1000000007;
System.out.print(patCnt);
}
}
Python代码2(AC,自己写的):思路也是遍历A,但是记录左右P和T的记录方式不太一样,这里记录的是P或T的累计量
inputLine = list(raw_input())
listLen =len(inputLine)
listP=[0]*listLen
listT=[0]*listLen
listP[0]= 1 if inputLine[0]=='P' else 0
listT[0]= 1 if inputLine[0]=='T' else 0
for i in xrange(1,listLen):
listP[i]=listP[i-1]
listT[i]=listT[i-1]
if inputLine[i]=='P':
listP[i]+=1
if inputLine[i]=='T':
listT[i]+=1
count=0
for i in xrange(1,listLen):
if inputLine[i]=='A':
count +=listP[i-1]*(listT[listLen-1]-listT[i-1])
count%=1000000007
print count
http://blog.youkuaiyun.com/u013167299/article/details/44261891