您的位置:首页 > 其它

hdu 5831 Rikka with Parenthesis II 2016 Multi-University 8

2016-08-12 18:34 417 查看
Problemacm.hdu.edu.cn/showproblem.php?pid=5831

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

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

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

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

#include <stdio.h>
#define N 100000
char stack
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: