记录:PAT basic level 1003

16 篇文章 0 订阅

题目

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。

理解

一开始对题目只是以为对字符串数组的应用掌握程度,于是在string与对其中字符的读取统计下功夫,最后提交发现全是错误。无奈只能求助于前辈的经验,结果在忽然的一篇博客中获得答案—其中的详细解答就不再赘述,下附博客链接可直接观看。

链接

link

代码解读(个人水平限制)

本人因为学习程度问题也是第一次遇见map<char, int> m;,整个代码的核心就在于这个容器,map实用性感觉非常高,如读者有余力可以进行观看学习,在此则不附上链接。

for(int j = 0; j < s.size(); j++) {
            m[s[j]]++;
            if (s[j] == 'P') p = j;
            if (s[j] == 'T') t = j;
        }

此处m[s[j]]++是通过循环s[j]从前向后不断读取字符,以此存入m对象中,且存储时自加以计数。
if (s[j] == 'P') p = j;语句中,得出‘P’在字符串中的索引并以‘p’来存储,下句’T’同理。

m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 
&& t-p != 1 && p * (t-p-1) == s.length()-t-1)

担心长度影响阅读,自己加了个回车。这句真的太美太优雅了,以作者初学者身份真的大受震撼。
m['P'] == 1是对m对象中存储的‘P’进行判定—是否存在且只有一个,后‘T’‘A’同理;m.size() == 3是判定容器中是否有且只有此三个要求字符;
t-p != 1要求‘P’与‘T’不能相邻,即在两者之间必须拥有一个空隙来存放一个‘A’;
p * (t-p-1) == s.length()-t-1)通过对题目的分析,要‘P’之前的‘A’个数乘‘P’和‘T’之间的‘A‘的个数等于’T‘之后的’A‘个数。p即是’P‘之前的个数,t-p-1则是中间的个数,s.length()-t-1则是结果即后面的’A’个数。

真希望自己什么时候也能有这种思路,这种代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值