题目匹配条件:
- 空字符串是匹配的;
- 如果字符串 s 是匹配的,那么 (s) 也是匹配的;
- 如果字符串 s 与 t 都是匹配的,那么 st 也是匹配的;
由题可知, “(” 与一个 “)” 配对,而且顺序是先出现 “(” 后出现 “)” ,才为配对关系。
- 所以我们用 while(cin>>a) 的方法,将字符一个一个输入。
while(cin>>a)
{
}
- 当输入 “(” 时,将其记录在变量pd_k中,说明存在有一个待配对的 “(” 。
if(a=='(')
{
pd_k++;
}
- 而输入 “)” 时需要判断是否存在了待配对的 “(” ,如果没有则这个 “(” 没有对应的关系需要删除,因为 “)” 的配对只与之前输入有关,与之后输入无关,用变量tots记录。
if(a==')')
{
if(pd_k<1)
{
tots++;
}
}
- 如果在前面存在有待配对的 “(” 则将其配对
if(a==')')
{
if(pd_k<1)
{
tots++;
}
if(pd_k>0)
{
pd_k--;
}//可以直接写在上个判断后面
}
- 在所有输入结束后,程序已经将所有配对的 “(” “)” 去除,而剩下的待配对的 “(” 是要删除的内容,所以tots加pd_k 。
总代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int pd_k=0,tots=0;
char a;
int main(){
while(cin>>a){
if(a=='('){
pd_k++;
}
if(a==')'){
if(pd_k<1){
tots++;
}else{
pd_k--;
}
}
}
tots+=pd_k;
cout<<tots;
return 0;
}