这次终于觉得智商不够用了,特么的。
总结给你的经验,对于这样字符串的题目,经常会出现一种叫做递归定义的东西。
还有一种叫做,相同的字母表示相同的字符串。
这道题目一共有三个条件。
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; }
时间: 2024-10-22 15:43:20