问题
给定一个长度为 𝑛 的字符串 𝑠,字符串由 (, ), [, ]组成,问 𝑠 是不是一个合法的括号序列。
合法的括号序列的定义是:
- 空串是一个合法的括号序列。
- 若 A 是一个合法的括号序列,则 (A), [A] 也是合法的括号序列。
- 若 A, B 都是合法的括号序列,则 AB 也是合法的括号序列。
例如:[(])
是不合法的
输入
第一行一个整数 𝑛。 对于所有数据,保证 𝑛≤100000。
接下来一行一个长度为 𝑛 的字符串 𝑠 。
输出
如果 𝑠 是合法的括号序列,输出 Yes,否则输出 No。
样例
输入: |
10 []([(())]) |
输出: |
Yes |
解析
#include <bits/stdc++.h>
using namespace std;
int k = 0,s[100100];
string s1;
int main(){
int n;
cin >> n >> s1;
//提前判断:如果n==0或者n为奇数至少会多出一个括号
if(n == 0 || n%2!=0){
cout << "No" << endl;
return 0;
}
for (int i = 0; i < n; i++) {
if (s1[i]=='[' || s1[i]=='(') {
s[++k] = s1[i];
continue;
}
if(s1[i]==')' && s[k]=='(') {
k--;
continue;
}
if(s1[i]==']' && s[k]=='[') {
k--;
continue;
}
//特殊情况
if(k == 0) {
cout << "No" << endl;
return 0;
}
}
if(k == 0){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
return 0;
}