• 缺失的括号


    题目描述

    一个完整的括号字符串定义规则如下:
    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;
    }
    //第一次未通过的测试样例:
    //)(())((((()()())))(()(())((()(()(((())(()(((((()))
    不一样的烟火
  • 相关阅读:
    《Code Complete》第一部分纪要
    深入理解Java虚拟机-JVM内存管理的猜测
    成长经验系列之三-猜想-技术未来
    深入理解Java虚拟机-第三版-前言及第一章笔记
    float与double的精度问题
    成长经验系列之二-方法-成长分享
    工作可能用的一些网站(不定时更新)
    Walkthrough: Write your first client script
    Make a Field Required in a Dynamics CRM Dialog / PowerApps
    Refresh Power BI Dataset programmatically from Dynamics 365 CRM/PowerApps
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11012836.html
Copyright © 2020-2023  润新知