ABC394D
一个很经典的题目。
题意
给出一个括号序列,如果满足序列中只存在 ()、[] 或 <> 这样的连续子串(如 ([])<>,像 ([<)]> 这种的不行),则它是一个好的括号序列。问这个括号序列是否是好的。
解法
总觉得在洛谷上看到过这种题。思路很简单,用一个栈维护序列的所有左括号,如果遇到了左括号就将其压入栈中,遇到了右括号就将其与栈顶的左括号进行配对,配对成功就弹栈,否则输出 No,然后结束程序。当然,遇到右括号时如果连左括号都没有了,就直接输出 No。
最后还要特判一下栈是否为空(别像我一样傻),为空则输出 Yes,否则输出 No。
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
const int N = 1e6 + 25, mod = 1e9 + 7;
const bool I_LOVE_CCF = true;
string s;
stack <char> st;
inline int read (int &n) {
int x = 0, f = 1;
char ch = getchar ();
while (! isdigit (ch)) {
if (ch == '-') f = -1;
ch = getchar ();
}
while (isdigit (ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar ();
}
n = x * f;
return n;
}
signed main () {
cin >> s;
int len = s.size ();
s = " " + s;//为了方便
rep (i, 1, len) {
if (s[i] == '(' || s[i] == '[' || s[i] == '<') st.push (s[i]);//左括号
else {
if (st.empty ()) {
puts ("No");
return 0;
}//没有与它配对的左括号,直接结束
char top = st.top ();
if ((s[i] == ')' && top == '(') || (s[i] == ']' && top == '[') || (s[i] == '>' && top == '<')) {
st.pop ();//配对成功,弹栈
} else {
puts ("No");
return 0;
}//配对失败
}
}
if (st.empty ()) puts ("Yes");
else puts ("No");//特判
return 0;
}

浙公网安备 33010602011771号