给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的
思路:
用栈的思想:
(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(); } }