首页 > 其他 > 详细

缺失的括号

时间:2019-06-12 22:05:54      阅读:118      评论:0      收藏:0      [点我收藏+]

题目描述

一个完整的括号字符串定义规则如下:
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!