[PAT B] 1003 我要通过! (20 分)

1003 我要通过!

题目

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

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

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

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

  3. 如果 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

思路分析

这题我想复杂了,看到条件二 xPATx 不自觉想到正则表达式的反向引用,但是条件三用正则比较复杂,虽然此题 AC 了,但是做的实在是很不漂亮,以后有时间还得重新研究一下。

条件1,2都非常简单

条件3要难点在于条件是递归式的,简单计算易得, a * b = c

c++ 应该使用 "." 保证转义,如 .1

正则搜索迭代器 regex_search() 注意不能用 "A*" 等无底线要求,会无限迭代

最后输出注意空行 \n

举一反三

正则虽好,其局限性也要在考虑范围内

推荐一本正则表达式的阅读书籍,我已经看完了,写的非常好:
精通正则表达式

我这边有复印版,想要的朋友也可以联系我

代码

#include <iostream>
#include <regex>
/*注意事项:
 * 条件1,2都非常简单
 * 条件3要难点在于条件是递归式的,简单计算易得, a * b = c
 * c++ 应该使用 "\\" 保证转义,如 "\\1"
 * 正则迭代器注意不能用 "A*" 等无底线要求,会无限迭代
 * 最后输出注意空行 "\n"
 * */
using namespace std;

int num = 0;
string str;
regex regex_1("[P|A|T]+");//满足条件一
regex regex_2("(A*)PAT\\1");//满足条件二直接输出
regex regex_3("A*PA+TA*");//条件三的大前提
regex regex_4("A+");//找到 A 的数量

bool checkString(string str) {
    int i = 0;
    bool r1, r2, r3, r4;
    smatch result;
    string temp[3];
    string::const_iterator iterStart = str.begin();
    string::const_iterator iterEnd = str.end();

    r1 = regex_match(str, regex_1);
    r2 = regex_match(str, regex_2);
    r3 = regex_match(str, regex_3);

    //使用迭代器,将正则匹配到的结果存在 temp[] 里
    while (regex_search(iterStart, iterEnd, result, regex_4)) {
        temp[i++] = result[0];
        iterStart = result[0].second;
    }

    //满足 a * b = c
    r4 = ((temp[0].size() * temp[1].size() == temp[2].size()));

    //r1 必须满足,r2 或 r3 && r4 满足即可
    if (r1 && (r2 || (r3 && r4))) {
        return true;
    } else return false;
}

int main() {
    cin >> num;
    string arr[num];
    for (int i = 0; i < num; i++) {
        cin >> str;
        if (checkString(str)) {
            arr[i] = "YES";
        } else arr[i] = "NO";
    }
    for (int i = 0; i < num; i++) {
        cout << arr[i] << "\n";
    }

    return 0;
}

本作品采用《CC 协议》,转载必须注明作者和本文链接
一只热爱编程的松鼠
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!