1. 程式人生 > >PAT 乙級 1003 題解 (Basic Level) Practice

PAT 乙級 1003 題解 (Basic Level) Practice

題目意思比較難懂。

我又看了這個文章,才懂的: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;
}