📅  最后修改于: 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++ 之外,其他编程语言也可以完全实现该题目的解答,只需要将代码实现进行相应的语法改动即可。