C程序-PAT-1040 有幾個PAT

字符串 APPAPT 中包含了兩個單詞 PAT,其中第一個 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二個 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

現給定字符串,問一共可以形成多少個 PAT

輸入格式:

輸入只有一行,包含一個字符串,長度不超過10​5​​,只包含 PAT 三種字母。

輸出格式:

在一行中輸出給定字符串中包含多少個 PAT。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。

輸入樣例:

APPAPT

輸出樣例:

2

 

思路分析1:常規思路,從頭開始掃描字符串,找到‘P’,然後就去找從此往後的‘A’,然後‘T’;這樣做需要三層循環,時間複雜度是O(n^{3}),數據一大就容易超時。

代碼:

#include <iostream>
#include <stdio.h>

int MAX = 100000;

int main( ) 
{
	char arr[MAX];
	int i,j,k;
	long long count=0;
	
	scanf("%s",arr);
	for(i=0;arr[i]!='\0';i++)
	{
		if(arr[i]=='P')
		{
			for(j=i+1;arr[j]!='\0';j++)
			{
				if(arr[j]=='A')
				{
					for(k=j+1;arr[k]!='\0';k++)
					{
						if(arr[k]=='T')
							count=count%1000000007+1;
					}
				}
			}
		}
	}
	
	printf("%lld",count);
	return 0;
}

思路分析2:從字符串尾部開始查找,該位置是‘T’,則是該位置之後‘T’的個數,若是‘A’,之後有幾個‘T’便能組成幾個“AT”,依次累加便能得到總的“AT”數目,若是‘P’,則該位置之後有幾個“AT”便能組成幾個“PAT”,累加便能得到總的“PAT數目”,時間複雜度爲O(n)。

#include <iostream>
#include <stdio.h>
#include <string.h>

int MAX=100000;

int main( ) 
{
	char str[MAX];//存儲字符串 
	int arr_A[MAX];//記錄該位置之後可以組成"AT"的個數 
	int arr_T[MAX];//記錄該位置之後有"T"的個數 
	
	int i,j;
	long long count=0;
	
	scanf("%s",str);
	
	int len=strlen(str);//統計字符串長度 
	
	for(i=len-1;i>=0;i--)//從字符串尾部開始掃描 
	{
		arr_A[i]=arr_A[i+1];//記錄該位置之後可以組成"AT"的個數
		arr_T[i]=arr_T[i+1];//記錄該位置之後有"T"的個數 
		if(str[i]=='P')//出現'P',即可組成"PAT" 
			count=(count+arr_A[i+1])%1000000007;//該'P'加上"AT",即是該位置之後"PAT"個數 
		if(str[i]=='A')//出現'A' 
			arr_A[i]=arr_A[i+1]+arr_T[i+1];//原來已經組成的"AT"個數加上'T'的個數即是現在"AT"個數 
		if(str[i]=='T')//出現'T' 
			arr_T[i]++;
	}
	
	printf("%lld",count);//輸出結果 
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章