PAT乙级(Basic)题库---1003

题目

1003-我要通过

解题思路

这道题主要是读懂题意,根据第一第二两个条件可得字符串如果中间为“PAT”,则字符串关于“PAT”对称,再由第三个条件可得初始情况为中间字符串为“PAT”,a=c为空字符串,或者是仅由字母 A 组成的字符串,即aPATa,推导一次得aPAATaa,中间每多一个字符‘A‘后面多一个字符串a。推导可得字符‘P’前的字符‘A’个数与字符‘P’和‘T’间的字符‘A’个数相乘等于字符‘T’后的字符‘A’个数。即
正确情况=A(x)PA(y)TA(z) x,y,z表示字母A的个数,x*y=z,其中y>=1。

代码

这里使用两种方法实现,一种直接通过循环查询字符串,一种通过字符串的find方法实现。

循环

#include<iostream>
#include<cstring>
#include<string.h>
using namespace std;
int main()
{
    //p记录字符‘P’位置,t记录字符‘T’位置,flag记录答案正确与否
    int n,p,t,flag;
    string a;
    cin>>n;
    while(n--)
    {
        cin>>a;
        flag=1;
        p=-1;
        t=-1;
        for(int i=0;i<a.length();i++)
        {
            if(a[i]=='P')
            {
                //第一次找到字符‘P’
                if(p==-1)
                {
                    p=i;
                }

                //多次找到字符‘P’,答案错误
                else
                {
                    flag=0;
                    break;
                }
            }
            else if(a[i]=='T')
            {
                //第一次找到字符‘T’
                if(t==-1)
                {
                    t=i;
                }

                //多次找到字符‘T’,答案错误
                else
                {
                    flag=0;
                    break;
                }
            }

            //字符不是‘P’,‘A’,‘T’中任何一个,答案错误
            else if(a[i]!='A')
            {
                flag=0;
                break;
            }
        }

        /*答案错误情况
        1.字符‘P’,‘T’间无字符‘A’或字符‘T’在字符‘P’前面
        2.三段‘A’字符串个数不符合条件
        */
        if((t-p)<2||p*(t-p-1)!=a.length()-t-1)
        {
            flag=0;
        }
        if(flag)
        {
            cout<<"YES\n";
        }
        else
        {
            cout<<"NO\n";
        }
    }
}

字符串find

#include<iostream>
#include<cstring>
#include<string.h>
using namespace std;
int main()
{
    //p记录字符‘P’位置,t记录字符‘T’位置
    int n,p,t;
    string a;
    cin>>n;
    while(n--)
    {
        cin>>a;

        //找到第一个非‘A’字符,找不到或不为‘P’则答案错误
        p=a.find_first_not_of('A');
        if(p==string::npos||a[p]!='P')
        {
            cout<<"NO\n";
        }
        else
        {
            /*找到‘P’字符后第一个非‘A’字符,答案错误情况
            1.找不到。
            2.不为‘T’。
            3.‘P’和‘T’间无字符‘A’。
            4.三段‘A’字符串个数不符合条件*/
            t=a.find_first_not_of('A',p+1);
            if(t==string::npos||a[t]!='T'||t-p<2||p*(t-p-1)!=a.length()-t-1)
            {
                cout<<"NO\n";
            }
            else
            {
                cout<<"YES\n";
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/h928066986/article/details/74999559
今日推荐