链接:https://ac.nowcoder.com/acm/contest/3005/B
来源:牛客网
给出一个仅包含'[',']','(',')','{','}'六种字符的括号序列,判断其是否合法。
- 空串是一个合法的括号序列
- 如果A, B 都是合法的括号序列,那么AB也是合法的括号序列
- 如果A是合法的括号序列,(A) , [A], {A}都是合法的括号序列
输入描述:
一行一个字符串S,只包含题目中的六种括号字符
输出描述:
输出为一行"Yes" 或"No"
示例1
输入
复制(){}[]
(){}[]
输出
复制Yes
Yes
示例2
输入
复制({[]})
({[]})
输出
复制Yes
Yes
示例3
输入
复制([)]
([)]
输出
复制No
No
备注:
1≤∣S∣≤1000000
使用栈,从左到右处理每一个括号:
-
如果是左括号,那么入栈,然后继续读下一个括号
-
如果是右括号,那么就要看这个右括号和栈顶的括号是否匹配
-
如果匹配,那么弹出栈顶的括号,继续读下一个括号,否则说明不合法
-
最后,如果栈为空,说明此括号序列是合法的。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
stack<char>s;
int main()
{
string a;
int flag=1;
cin>>a;
int l=a.size();
if(l%2!=0)
{
cout<<"No"<<endl;return 0;}
for(int i=0;i<l;i++)
{
if(a[i]=='('||a[i]=='{'||a[i]=='[')
s.push(a[i]);//进栈
else if(!s.empty())
{
if(a[i]==')'&&s.top()=='(')
s.pop();//弹出
if(a[i]=='}'&&s.top()=='{')
s.pop();
if(a[i]==']'&&s.top()=='[')
s.pop();
}
else {
flag=0;break;}
}
if(flag&&s.empty())
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
链接:https://ac.nowcoder.com/acm/contest/3007/G
来源:牛客网
题目描述
合法括号序列的定义是:
1.空序列是合法括号序列
2.如果 S 是一个合法括号序列,那么(S)是合法括号序列
3.如果 A 和 B 都是合法括号序列,那么 AB 是一个合法括号序列
现在给定一个括号序列,求最少删去几个括号能得到一个合法的括号序列
输入包含 T 组数据,每组数据中,设括号序列的长度为 N
1≤T,ΣN≤1,000,000
(由于空串是合法的括号序列,所以答案可以是N)
输入描述:
第一行一个数字 T
接下来 T 组数据共 2T 行,每组数据第一行是 N
第二行则是一个长度为 N 的括号序列
输出描述:
T 行 T 个数字,表示输入的括号序列最少删去几个括号能得到一个合法的括号序列
示例1
输入
复制2 6 ())(() 9 ()(()()))
2 6 ())(() 9 ()(()()))
输出
复制2 1
2 1
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int t;
string s;
cin>>t;
while(t--)
{
int n;
cin>>n;
int x=0,y=0;
cin>>s;
getchar();
for(int i=0;i<n;i++)
{
if(s[i]=='(') x++;
else if(s[i]==')'&&x==0) y++;
else if(s[i]==')'&&x!=0) x--;
}
cout<<x+y<<endl;
}
return 0;
}