天天看点

错字(春季每日一题 57)

贝茜刚买了一台新的笔记本电脑,但不幸的是,她发现自己打不好字,因为相对于小键盘来说,她的大蹄子太大了。

贝茜刚刚在尝试输入一个平衡括号字符串。

但是,她意识到她可能将其中某个字符输错了,即将 ​

​(​

​​ 错输为 ) 或将 ​

​)​

​​ 错输为 ​

​(​

​。

请帮助贝茜找到字符串的所有位置中,满足反转该位置上的字符后,括号字符串变得平衡的位置数量。

有若干种定义括号字符串是否“平衡”的方式。

最简单的定义为字符串所包含的 ​

​(​

​​ 和 ​

​)​

​​ 数量必须相同,并且对于字符串的任意前缀,所包含的 ​

​(​

​​ 的数目都不少于 ​

​)​

​ 的数目。

例如,以下字符串都是平衡的:

()
(())
()(()())      

以下则不是:

)(
())(
((())))      

输入格式

一个长度为

输出格式

输出字符串的所有位置中,满足反转该位置上的字符后,括号字符串变得平衡的位置数量(如果有的话)。

数据范围

输入的字符串满足:最多只修改一个字符,即可变为平衡括号字符串。

输入样例:

()(())))      

输出样例:

4      

样例解释

输入字符串如下:

12345678
()(())))      
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main(){
    
    string s;
    cin >> s;
    
    int l = 0, r = 0;
    for(auto c: s)
        if(c == '(') l++;
        else r++;
    
    if(l == r) puts("0");
    else if(r > l){
        
        int a = 0, b = 0;
        for(auto c: s)
            if(c == '(') a++;
            else{
                b++;
                if(b > a){
                    cout << b << endl;
                    break;
                }
            }
        
    }else{
        
        int a = 0, b = 0;
        reverse(s.begin(), s.end());
        for(auto c: s)
            if(c == ')') b++;
            else{
                a ++;
                if(a > b){
                    cout << a << endl;
                    break;
                }
            }
    }
    
    return 0;
}