15-括号匹配(二)
- 内存限制:64MB 时间限制:1000ms 特判: No
- 通过数:88 提交数:261 难度:6
题目描述:
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入描述:
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出描述:
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入:
4
[]
([])[]
((]
([)]
样例输出:
0
0
3
2
思路:
用栈的思想:
(1)左括号直接入栈
(2)若是右括号且与栈顶左括号匹配,则左括号出栈
(3)剩下的情况,我们向前遍历栈,知道遇到与右括号匹配的,中间的cnt个括号都是不匹配的,ans+=cnt,中间元素通通出栈
若是没匹配的,则ans++,中间元素不出栈
(4)剩下的元素都是不匹配的,ans+=(对列还剩多少元素)
(用数组模拟栈呀)
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
char s[105];
void solve(){
char S[105];
int len=strlen(s);
int ans=0,top=0;
for(int i=0;i<len;i++){
char t=S[top];
if(s[i]=='('||s[i]=='[')S[++top]=s[i];
else if(s[i]==')'&&t=='('||s[i]==']'&&t=='['){
top--;
}
else{
int cnt=0,flag=0,k=top;
while(k){
char t=S[k];
if(s[i]==')'&&t=='('||s[i]==']'&&t=='['){
flag=1;
break;
}
else {
cnt++;
k--;
}
}
if(!flag){
ans++;
}
else{
top=k-1;
ans+=cnt;
}
}
}
ans+=top;
printf("%d\n",ans);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s);
solve();
}
}