NC21874 好串

题目

题目描述

牛牛喜欢跟字符串玩耍,他刚刚学会了一个新操作,将一个字符串x插入另一个字符串y中(包括放在开头和结尾)
牛牛认为如果一个串是好的当这个串能按照如下方法被构造出来:
一开始,有一个空串,然后执行0次或者若干次操作,每次操作将ab插入当前的字符串

根据上面的定义,ab, aabb, aababb都是好串,aab,ba,abbb并不是好串

现在给你一个字符串s,判断s是否是好串

输入描述

输入一行包含一个字符串,长度不超过 \(50\)

输出描述

输出"Good" 或者 "Bad"

示例1

输入

ab

输出

Good

示例2

输入

aab

输出

Bad

示例3

输入

abaababababbaabbaaaabaababaabbabaaabbbbbbbb

输出

Bad

备注

子任务1:\(n \leq 10\)
子任务2:\(n \leq 20\)
子任务3:无限制

题解

方法一

知识点:模拟。

这是一道类似括号匹配的题。用 \(cnt\) 记录 \(ab\) 匹配情况,\(a\) 加一,\(b\) 减一。如果过程中 \(cnt<0\) ,则说明 \(b\) 多了;若最后 \(cnt>0\),则说明 \(a\) 多了。

这种方法只适合一组匹配的对象,多组不同的需要用栈。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

方法二

知识点:栈。

\(a\) 存入栈,若遇到 \(b\) 则匹配栈顶的 \(a\) ,如果栈空说明 \(b\) 多了;最后如果还存在 \(a\) ,即栈非空,则说明 \(a\) 多了。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

方法一

#include <bits/stdc++.h>

using namespace std;

bool check(string str) {
    int cnt = 0;
    for (auto c : str) {
        if (c == 'a') cnt++;
        else cnt--;
        if (cnt < 0) return 0;
    }
    if (cnt > 0) return 0;
    return 1;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    string str;///单一成对变量可以用计数解决,但是有不同成对的需要用栈
    cin >> str;
    if (check(str)) cout << "Good" << '\n';
    else cout << "Bad" << '\n';
    return 0;
} 

方法二

#include <bits/stdc++.h>

using namespace std;

bool check(string str) {
    stack<char> s;
    for (auto c : str) {
        if (c == 'a') s.push(c);
        else if (!s.empty() && s.top() == 'a' && c == 'b') s.pop();
        else return 0;
    }
    if (!s.empty()) return 0;
    return 1;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    string str;
    cin >> str;
    if (check(str)) cout << "Good" << '\n';
    else cout << "Bad" << '\n';
    return 0;
}
posted @ 2022-07-02 00:42  空白菌  阅读(80)  评论(0)    收藏  举报