nyoj15 - 括号匹配(二) - 栈

    xiaoxiao2023-10-26  32

    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(); } }

     

    最新回复(0)