字符串 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;
}