PAT 乙級 1003 題解 (Basic Level) Practice
阿新 • • 發佈:2019-01-12
題目意思比較難懂。
我又看了這個文章,才懂的:https://blog.csdn.net/liuchuo/article/details/51994881
分析:
任意形如 xPATx 的字串都可以獲得“答案正確”,其中 x 或者是空字串,或者是僅由字母 A 組成的字串;
那麼正確的有這些:
PAT
APATA
AAPATAA
AAAPATAAA
...不說了,就是中間一個A左右加上等量的A(不加也行)都是正確的。如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是空字串,或者是僅由字母 A 組成的字串。
拿上面的那幾個正確的舉例子,那麼正確的有這些:
PAT —— 對於 aPbTc 來說ac是空,b是A。所以 PAAT 是正確的。同理PAAAAAT中間加多少個A都是正確噠~
APATA —— 對於aPbTc來說,abc都是A。所以 APAATAA 是正確的。再類推一下,那麼 APAAATAAA 是正確的。
AAPATAA —— 對於aPbTc來說,a和c是AA,b是A。所以AAPAATAAAA是正確的,再類推一下,AAPAAATAAAAAA 是正確的~
所以說規律就是,可以在P和T中間加A並且在T後面加A,要求必須是,中間加上一個A,末尾就得加上幾倍的(P前面A的那個字串)。換句話說就是,中間的A的個數如果是3,那麼末尾的A的個數就得是開頭A的個數的3倍。很巧,當中間A為一個的時候,末尾和開頭A的個數必須相等正好是第二條的要求~~~所以一句話總結字串的要求:只能有一個P一個T,中間末尾和開頭可以隨便插入A。但是必須滿足開頭的A的個數 * 中間的A的個數 = 結尾的A的個數
所以檢驗的時候,讓i停留在出現P的地方,然後讓k停留在字串裡面T的地方,那麼len - 1 - k就是T後面的A的個數,k - 1 - i就是P和T中間的A的個數,而i呢是P前面A的個數~因為必須滿足開頭的A的個數*中間的A的個數 = 結尾的A的個數。所以檢驗的程式碼為(len - 1 - k) == ((k - 1 - i) * i);
記得要判斷一下字串中出現的每個字母,如果出現了PAT之外的字母,說明不符合題意;如果整個字串都沒有出現P或者A或者T,說明也是不符合題意的~(我的程式碼中是增加一個book標記三個字母是否出現過~如果有一個字母沒出現過,就要return false)
#include<stdio.h>
int main()
{
int n;
char s[101];
scanf("%d\n",&n);
int l,m,r,i,p,t,ii;
bool flag;
for(ii=0;ii<n;ii++)
{
l=0,m=0,r=0,p=0,t=0;
flag=true;
scanf("%s",s);
//fgets(s,101,stdin);
for(i=0;s[i]!='\n'&&s[i]!=0;i++)
{
if(s[i]=='P')
{
p++;
if(p>1)
{
flag=false;
break;
}
}else if(s[i]=='T')
{
t++;
if(t>1||p<1)
{
//p<1代表T出現時並未出現P
flag=false;
break;
}
}else if(s[i]=='A')
{
if(p>0&&t>0)
r++;
else if(p>0)
m++;
else
l++;
}else
{
flag=false;
break;
}
}
//p或者t為0說明P和T未出現
if(l*m!=r||m==0||p==0||t==0)
flag=false;
if(flag==false)
printf("NO");
else
printf("YES");
if(ii!=n-1)
printf("\n");
}
return 0;
}