Fork me on GitHub

PAT乙1003

这次终于觉得智商不够用了,特么的。

总结给你的经验,对于这样字符串的题目,经常会出现一种叫做递归定义的东西。

还有一种叫做,相同的字母表示相同的字符串。

 

这道题目一共有三个条件。

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

其中,最重要的是第三个定义。

1、第一次读这条定义,那么需要满足第二条定义,那么b只可能是A,a和c必定相等,所以你能得到只有一种XPAATXX正确的错觉。

2、但是重点来了,XPAATXX的形式正确了,那么它又可以代入第三个条件了。

3、也就是说中间再加一个A,变成XPAAATXXX,这样的形式也就正确了。

 

这就是传说的递归定义。

其实树本身也是一种递归的定义。这里就不多说了。其实和这个的思想是一样的。

这道题目坑就坑在这里了。所以对于字符串的题目一定要小心这一点,很容易栽。

 

下面的代码仅仅是为了凑字数哦,写的超级烂,因为题目的意思经过一波三折,所以改动的太多,最后就成这副面目全非的样子了,好同学看到这里就可以了。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string.h>

using namespace std;

int main()
{
    char ch[105];
    int n,i,flag;//flag:0最前面,1P之后,2A之后,3T之后
    int aN = 0;//中间A的个数
    int aNU = 0;//前面A的个数
    int aNUM = 0;//后面A的个数
    int len;
    scanf("%d\n",&n);
    while (n--)
    {
        flag=0;
        aN =0;
        aNU=0;
        aNUM=0;
        gets(ch);
        len = strlen(ch);
        for (i = 0; i < len; i++)
        {
            if(flag == 0 && ch[i] == 'P')
            {
                flag = 1;
                continue;
            }
            else if(flag == 0 && ch[i] == 'A')
            {
                aNU++;
                continue;
            }
            else if(flag == 1 && ch[i] == 'A')
            {
                aN++;
                flag = 2;
                continue;
            }
            else if(flag == 1 && ch[i] != 'A')
            {
                break;
            }
            else if(flag == 2 && ch[i] == 'T')
            {
                flag = 3;
                continue;
            }
            else if(flag == 2 && ch[i] == 'A')
            {
                aN++;
                continue;
            }
            else if(flag == 3 && ch[i] != 'A')
            {
                flag = 0;
                break;
            }
            else if(flag == 3 && ch[i] == 'A')
            {
                aNUM++;
                continue;
            }
            break;
        }
        if(flag == 3 && aN == 1 && aNU != aNUM)
            cout<<"NO"<<endl;
        else if(flag == 3 && aN == 1 && aNU == aNUM)
            cout<<"YES"<<endl;
        else if(flag == 3 && aN*aNU == aNUM)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;  
}
复制代码
posted @   LinkinStar  阅读(345)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示