PAT Advanced 1093. Count PAT's (25) 同 PAT Basic 1040

12 篇文章 0 订阅
6 篇文章 0 订阅

注意:

        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.csdn.net/u013167299/article/details/44261891

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值