字符串 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
思路分析1:常规思路,从头开始扫描字符串,找到‘P’,然后就去找从此往后的‘A’,然后‘T’;这样做需要三层循环,时间复杂度是O(),数据一大就容易超时。
代码:
#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;
}