练习9-----牛牛的括号匹配

10 篇文章 0 订阅

如果一个括号序列中的每一个左括号都有一个右括号与之完成配对,这个序列就是一个合法的括号匹配序列。
例如:“((())),()()()”是合法的括号匹配序列,
“(((())()((()”是不合法的括号匹配序列。

牛牛得到了一系列的括号序列,牛牛要从这个系列中任意选取两个位置进行一次交换操作,仅且只能进行一次操作。牛牛想知道能否通过这次操作,把这个系列变成合法的括号匹配序列。

输入描述:
输入第一行包括测试样例数t(1<=t<=1000);
接下来t行,每行一个括号序列s(1<=length(s)<=100000),表示每个括号序列。
输出描述:
如果可以通过一次交换变成合法的括号匹配序列,则输出“YES”,否则输出“NO”

输入示例:
2
())(
)))(((
输出示例:
YES
NO

代码如下:

#include<iostraem>
#include<string>
#include<stack>
using namespace std;


const int maxn =100000;
char str[maxn];
stack<char>s;
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		while (!s.empty())  s.pop();
		cin >> str;
		int n = strlen(str);
		if (n == 2)
		{
			if (str[0] == '('&&str[1] == ')')
			{
				cout << "NO" << endl;
				continue;
			}
		}

		int i = 0;
		int flag = 0;
		for (i = 0; i < n; ++i)
		{
			if (str[i] == '(')
			{
				s.push('(');
			}
			else
			{
				if (!s.empty())
				{
					s.pop();
				}
				else
				{
					if (flag) break;
					flag = 1;
					s.push('(');
				}
			}
		}

		if (i == n)
		{
			if (!flag)
			{
				if (s.empty())
					cout << "YES" << endl;
				else
					cout << "NO" << endl;
			}
			else
			{
				if (s.size() != 2)
					cout << "NO" << endl;
				else
					cout << "YES" << endl;
			}
		}
		else
		{
			cout << "NO" << endl;
		}
	}
	return 0;
}

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值