hdu 5831 Rikka with Parenthesis II 2016 Multi-University 8

Problemacm.hdu.edu.cn/showproblem.php?pid=5831

题意:给个括号序列,问能不能通过一次把两个不同位置的符号交换的操作,使得序列里的所有括号左右配对合法

分析:左括号进栈,如果是右括号而且栈顶是左括号,就两个一起弹出

题目要求一定有且只有一次操作,如果最后发现栈空(全部配对正确),而原来的序列长度又不足4(那就只能长为2),交换一次就变成不合法

之前一直卡一种情况:” ) ) ( (  “…因为留在栈内的括号不只一对,但交换一次就能同时使两对都合法配对

#include <stdio.h>
#define N 100000
char stack[N];
int main()
{
	int iTom;
	scanf("%d", &iTom);
	while( iTom-- )
	{
		int i,n,top,left,right;
		scanf("%d%*c", &n);
		for(i = top = 0; i<n; i++)
		{
			stack[top++] = getchar();
			// 合法配对一起弹出
			if( stack[top-1] == ')' && top > 1 && stack[top-2] == '(' )
			  top -= 2;
		}
		// 数栈内左、右括号各几何
		// 留在栈里的都是未合法配对的
		for(i = left = right = 0; i<top; i++)
		  if( stack[i] == '(' )
		  	left++;
		  else
		  	right++;
		if( left == right && left < 3 ) // 左、右括号数相同
		  if( !left ) // 栈空,全配完对
			if( n > 2 ) // 原始序列不只一对括号
			  puts("Yes");
			else
			  puts("No");
		  else // 栈非空
			puts("Yes");
		else // 左、右括号数不等,或相等但多于一对,只交还一次不行
		  puts("No");
	}
	return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值