持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}