缺失的括号

题目描述

一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ""和"(())()"是完整的括号字符串,"())(", "()(" 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。

输入描述:

输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50).
s中每个字符都是左括号或者右括号,即'('或者')'.

输出描述:

输出一个整数,表示最少需要添加的括号数
示例1

输入

复制
(()(()

输出

复制
2
最初解题思想:保证左括号和右括号数目相同就可以,遇到左括号cnt++,遇到右括号cnt--,输出结果为左右括号的绝对值,通过率为60%
没有通过的样例:)(())((((()()())))(()(())((()(()(((())(()(((((())),)(
思想的bug:第一个如果是)第二个是(也就意味着绝对值等于0
进一步解题思想:加一个计数cnt<0的标志cnt_zero,当cnt<0,cnt_zero++,(就是即使左右括号数相等也要加上的括号)并且将cnt置为0重新计算还要匹配的括号数。
完整代码如下:
#include <iostream>
#include <cmath>
//我好像是一个在海边玩耍的孩子,
//不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞,
//而展现在我面前的是完全未探明的真理之海.
using namespace std;

int main()
{
    string str;
    int cnt=0,cnt_zero=0;
    getline(cin,str);
    for(int i=0;i<str.size();i++){
        if(str[i]=='(')cnt++;
        if(str[i]==')')cnt--;
        if(cnt<0){cnt_zero++;cnt=0;}
    }
  //cout<<abs(cnt)<<endl;
  cout<<cnt+cnt_zero<<endl;
  //cout<<cnt<<endl;
    //cout << "Hello world!" << endl;
    return 0;
}
//第一次未通过的测试样例:
//)(())((((()()())))(()(())((()(()(((())(()(((((()))
不一样的烟火
原文地址:https://www.cnblogs.com/cstdio1/p/11012836.html