pat 1003 java_PAT 乙级 1003.我要通过! C++/Java

1003 我要通过! (20 分)

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

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

字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;

任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

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

输出格式:

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

输入样例:

8

PAT

PAAT

AAPATAA

AAPAATAAAA

xPATx

PT

Whatever

APAAATAA

输出样例:

YES

YES

YES

YES

NO

NO

NO

NO

分析:

只能有一个P一个T

对于 xPATx,PAT, AAPATAA都是YES,只要两端的 A 的个数相同

对于aPbTc和aPbATca,

PAT是正确的,那么PAAT也是正确的

AAPATAA是正确的,那么AAPAATAAAA也是正确的

总结:只能有一个P和T,前面A的个数 * 中间A的个数 = 后面A的个数

可以用三个变量,front,mid,rear将每个部分的A的个数记录下来,最后判断front * mid是否等于rear

1 #include

2 #include

3 using namespacestd;4

5 bool pass(stringstr)6 {7 if (str == "PAT")8 {9 return true;10 }11

12 intindex, front, mid, rear;13 index = front = mid = rear = 0;14

15

16 while (str[index] == 'A')17 {18 index++;19 front++; //记录前面A的个数

20 }21 if (str[index] == 'P')22 {23 index++;24 }25 else

26 {27 return false;28 }29

30 while (str[index] == 'A')31 {32 mid++; //记录中间A的个数

33 index++;34 }35

36 if (str[index] == 'T')37 {38 index++;39 }40 else

41 {42 return false;43 }44

45 while (str[index] == 'A')46 {47 rear++; //记录后面A的个数

48 index++;49 }50

51 if (!str[index] && rear == mid * front && mid > 0)52 {53 return true;54 }55

56 return false;57 }58

59 intmain()60 {61 intn;62 stringstr;63 cin >>n;64

65 for (int i = 0; i < n; ++i)66 {67 cin >>str;68 bool flag =pass(str);69 if(flag)70 {71 cout << "YES" <

74 {75 cout << "NO" <

79 return 0;80 }

map解法:

首先了解下 map是什么, map 是 C++ 的STL容器,内部实现是红黑树(一种非严格意义的平衡二叉树,具有排序功能), map 提供一对一的关系

map 类模板定义在头文件map 中,它定义了一个保存 T 类型对象的 map, 每个 T 类对象都有一个关联的K类型的键。

map的特性:

所有的元素会根据元素的键值(key)自动排序

map所有元素都是pair,同时拥有key(键值)和value(实值)

pair的第一个元素视为键值key,第二个元素视为实值value

map不允许两个元素拥有相同的键值

map的基本构造函数

mapintMap;

mapstrMap;

map< char ,string>charMap;

mapstrMap;

mapcharMap;

mapintMap;

map的基本操作函数

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

begin() 返回指向map头部的迭代器

clear() 删除所有元素

count() 返回指定元素出现的次数

empty() 如果map为空则返回true

end() 返回指向map末尾的迭代器

equal_range() 返回特殊条目的迭代器对

erase() 删除一个元素

find() 查找一个元素

get_allocator() 返回map的配置器

insert() 插入元素

key_comp() 返回比较元素key的函数

lower_bound() 返回键值>=给定元素的第一个位置

max_size() 返回可以容纳的最大元素个数

rbegin() 返回一个指向map尾部的逆向迭代器

rend() 返回一个指向map头部的逆向迭代器

size() 返回map中元素的个数

swap() 交换两个map

upper_bound() 返回键值>给定元素的第一个位置

value_comp() 返回比较元素value的函数

View Code

思路:

将 P, A, T 三个字符作为键值存入map,对应的value是它们出现的次数,最后还要判断 map.size()是否等于3

1 #include

2 #include

3 #include

4 using namespacestd;5

6 bool pass(stringstr)7 {8 mapcharMap;9 int length =str.size();10 int posOfP = 0, posOfT = 0;11 for (int i = 0; i < length; ++i)12 {13 charMap[str[i]]++;14 if (str[i] == 'P')15 {16 posOfP = i; //这时候的i为P前面 A 的个数(执行完循环体的步骤才会执行++i)也可以理解为P的位置

17 }18 if (str[i] == 'T')19 {20 posOfT = i; //i为T的位置

21 }22 }23 if (charMap['P'] == 1 && charMap['T'] == 1 && charMap['A'] != 0 && charMap.size() == 3 && posOfT - posOfP != 1 && posOfP*(posOfT - posOfP - 1) == str.size() - posOfT - 1)24 {25 return true;26 }27 else

28 {29 return false;30 }31 }32

33

34 intmain()35 {36 intn;37 stringstr;38 cin >>n;39

40 for (int i = 0; i < n; ++i)41 {42 cin >>str;43 bool flag =pass(str);44 if(flag)45 {46 cout << "YES" <

49 {50 cout << "NO" <

23行代码:

if (charMap['P'] == 1 && charMap['T'] == 1 && charMap['A'] != 0 && charMap.size() == 3 && posOfT - posOfP != 1 && posOfP*(posOfT - posOfP - 1) == str.size() - posOfT - 1)

charMap['P'] == 1 && charMap['T'] == 1 && charMap['A'] != 0 && charMap.size() == 3

为了防止出现`PT` 或 P和T个数大于1的情况

而charMap.size() == 3 是为了防止出现除 PAT 之外的字母

posOfT - posOfP != 1 && posOfP*(posOfT - posOfP - 1) == str.size() - posOfT - 1)

1.假设给定字符串是AAPATAA,那么posOfT = 4, posOfP = 2, posOfT - posOfP = 2,所以,中间A的个数 = posOfT - posOfP - 1

2.假设给定字符串是PT,那么 posOfT - posOfP = 1,所以posOfT - posOfP != 1是用来排除PT这种中间没有A的情况的

3.假设给定字符串是AAPATAA,那么str.size() = 7, posOfT = 4, str.size() - posOfT - 1 = 后面A的个数

满足上述条件就返回 true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值