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;
}
posted @ 2025-02-22 21:38  XXh_Laoxu  阅读(25)  评论(0)    收藏  举报

转载请注明出处!


#页面摧毁游戏#
使用【上下左右】控制飞行器的运动
使用【空格】发射导弹
点击开始摧毁