贝茜刚买了一台新的笔记本电脑,但不幸的是,她发现自己打不好字,因为相对于小键盘来说,她的大蹄子太大了。
贝茜刚刚在尝试输入一个平衡括号字符串。
但是,她意识到她可能将其中某个字符输错了,即将 ( 错输为 ) 或将 ) 错输为 (。
请帮助贝茜找到字符串的所有位置中,满足反转该位置上的字符后,括号字符串变得平衡的位置数量。
有若干种定义括号字符串是否“平衡”的方式。
最简单的定义为字符串所包含的 ( 和 ) 数量必须相同,并且对于字符串的任意前缀,所包含的 ( 的数目都不少于 ) 的数目。
例如,以下字符串都是平衡的:
()
(())
()(()())
以下则不是:
)(
())(
((())))
输入格式
一个长度为 N 的括号字符串。
输出格式
输出字符串的所有位置中,满足反转该位置上的字符后,括号字符串变得平衡的位置数量(如果有的话)。
数据范围
1≤N≤105
输入的字符串满足:最多只修改一个字符,即可变为平衡括号字符串。
输入样例:
()(())))
输出样例:
4
样例解释
输入字符串如下:
12345678
()(())))
反转位置 2,5,6,7 中任一位置上的字符,都能使得括号字符串变得平衡。
代码:
// 分类讨论 由上文判断条件可知 若r>l 当第一次右括号前缀和大于左括号时 修改必然不可能在后面 前面的所有右括号地位等同都可以修改
#include <bits/stdc++.h>
using namespace std;
string str;
int main()
{
cin >> str;
int l = 0, r = 0;
for (auto ch : str)
{
if (ch == '(')
l++;
else
r++;
}
if (l == r)
cout << 0 << endl;
else if (l < r)
{
int a = 0, b = 0;
for (auto ch : str)
{
if (ch == '(')
a++;
else
{
b++;
if (a < b)
{
cout << b << endl;
break;
}
}
}
}
else
{
int a = 0, b = 0;
reverse(str.begin(), str.end());
for (auto ch : str)
{
if (ch == ')')
a++;
else
{
b++;
if (a < b)
{
cout << b << endl;
break;
}
}
}
}
return 0;
}