算法题(错字)

135 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

错字

题目描述

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

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

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

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

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

最简单的定义为字符串所包含的 ( 和 ) 数量必须相同,并且对于字符串的任意前缀,所包含的 ( 的数目都不少于 ) 的数目。

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

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

以下则不是:

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

输入格式

一个长度为 NN 的括号字符串。

输出格式

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

数据范围

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

输入样例:

()(())))

输出样例:

4

样例解释

输入字符串如下:

12345678
()(())))

反转位置 2,5,6,72,5,6,7 中任一位置上的字符,都能使得括号字符串变得平衡。

代码

#include <bits/stdc++.h>
using namespace std;

int res;
string s;
stack<int> st; 

int main(){

    cin >> s;
    int n = s.size();

    if(n & 1){
        cout << 0 << endl;
        return 0;
    }

    for (int i = 0; i < n; i ++ ){
        if (st.empty())    
            st.push(i);  
        else if (s[st.top()] == '(' && s[i] == ')')    
            st.pop();
        else
            st.push(i);
    }

    if (st.size() >= 2){
        int pos = st.top();
        st.pop();

        if (s[pos] == ')') {
            for (int i = 0; i < pos; ++i)
                if (s[i] == ')')    
                    res++;
        }
        else {
            for (int i = pos; i < n; ++ i )
                if (s[i] == '(')    
                    res++;
        }
    }
    cout << res << endl;
    return 0;
}