📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019年1月24日)|问题8(1)

📅  最后修改于: 2023-12-03 15:28:46.608000             🧑  作者: Mango

题目介绍

本题为 Sudo GATE 2020 Mock III 中的第八题,出现于 2019 年 1 月 24 日的模拟考试中。题目难度为中等,主要考察的是对程序代码逻辑的分析和理解能力。

题目描述

给定一个字符串 s,它可能包含括号字符和字母字符。请编写一个函数 bool check_balance(string s),判断字符串中的括号是否成对出现,并且括号之间的字母是否匹配。如果括号成对出现且字母匹配,则返回 true,否则返回 false。注意:如果字符串中没有括号,则默认为括号成对出现且字母匹配。

例如,对于字符串 "(abc(def)g)",应该返回 true,因为所有括号成对出现,且每对括号之间的字母都匹配。

而对于字符串 "abc((def)g)",应该返回 false,因为第二个左括号与第一个右括号不成对,导致括号未能完全匹配。

样例
assert(check_balance("") == true);          // 空字符串默认匹配
assert(check_balance("aa(bbb)ccc") == true);
assert(check_balance("abc((def)g)") == false);
assert(check_balance("(a(b(cint)eam)di(di)in)g(ros)e") == true);
assert(check_balance("(This is (test)a(b(cd)e) case)") == true);
题目解析

这道题目主要考察的是对字符串的遍历和判断。首先,对于只有字母的字符串,无需特殊处理,直接返回 true 即可。对于带有括号的字符串,需要遍历字符串中的每一个字符,判断字符是否为括号。如果是左括号,将其入栈;如果是右括号,则出栈栈顶元素,并判断出栈的元素是否为左括号,并且两个括号之间的字母是否匹配。如果所有的字符都被遍历过后,栈为空,则说明所有的括号都成对出现,返回 true;否则,栈中剩余元素未被配对,返回 false。

代码实现

下面是 C++ 语言的代码实现,时间复杂度为 $O(n)$,其中 $n$ 为字符串的长度。

#include <iostream>
#include <stack>

using namespace std;

bool check_balance(string s) {
    stack<char> stk;
    for(int i=0; i<s.size(); i++) {
        if(s[i] == '(' || s[i] == '[' || s[i] == '{') {
            stk.push(s[i]);
        } else if(s[i] == ')') {
            if(stk.empty() || stk.top() != '(') {
                return false;
            }
            stk.pop();
        } else if(s[i] == ']') {
            if(stk.empty() || stk.top() != '[') {
                return false;
            }
            stk.pop();
        } else if(s[i] == '}') {
            if(stk.empty() || stk.top() != '{') {
                return false;
            }
            stk.pop();
        }
    }
    return stk.empty();
}

int main() {
    assert(check_balance("") == true);
    assert(check_balance("(a(b(cint)eam)di(di)in)g(ros)e") == true);
    assert(check_balance("(This is (test)a(b(cd)e) case)") == true);
    assert(check_balance("aa(bbb)ccc") == true);
    assert(check_balance("(abc(def)g)") == true);
    assert(check_balance("abc((def)g)") == false);
    return 0;
}
总结

本题是一道不错的字符串匹配题目,需要对栈数据结构以及字符串的基本操作进行熟练掌握。除了 C++ 之外,其他编程语言也可以完全实现该题目的解答,只需要将代码实现进行相应的语法改动即可。