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;
}

 

Guess you like

Origin blog.csdn.net/qq_40788199/article/details/98472860
PAT