问题:
分析:
本题有规律:开始不知道'('和 ')'哪个多,策略也不相同
①. 第一步判断左括号和右括号谁多,'('多,用策略1;')'多,用策略1
- 策略1:
- 正常情况:左侧开始遍历()从第一个开始,出现左括号和右括号个数相同时则删除,剩下的则左括号的个数减1,则为可以替换的个数
- 特殊情况:当出现 `左括号个数-右括号个数=1` 时,为特殊情况此时第一个)前的左括号不计数
- 例如:
- `()()(())(((()) `此时,左括号个数大于右括号个数用策略1,可看做为`(((())`,此时左括号个数为4个,最左侧(不能变动,所以4-1=3个;
- `()((())(() `可化简为` ((())(()` ,此时我们发现` ((())(() `红色左括号的也是不能变换的,会对应不上,此时我们需要加个判断规则:化简后的第一个)后的才开始计数,即此处5-3=2个;
- 策略2:从右侧开始,和策略1基本一致,从右往左遍历,规则反过来即可
#include<bits/stdc++.h>
using namespace std;
string st;
int main()
{
cin >> st;
int stsize = st.size();
int sleft = 0, sright = stsize - 1;
if (st[sleft] == ')' || st[sright] == '(') {
cout << 1;
return 0;
}
//看谁多
int lsum = 0, lright = 0;
for (int i = 0; i < stsize; i++) {
if (st[i] == '(') lsum++;
else lright++;
}
// 此处用temp记录,temp其实为1,因为每一步都会有a=1,b=0的情况所以temp=1。
int a = 0, b = 0,temp=0;
if (lsum > lright) { //左括号多
for (int i = 0; i < stsize; i++) {
if (st[i] == '(')
{
if (a - b == 1) { //此为特殊情况
temp = a;
}
a++;
}
else b++;
if (a == b) {
a = 0;
b = 0;
temp = 0;
}
}
}
else if (lsum < lright) { //右括号多
for (int i = stsize - 1; i >= 0; i--) {
if (st[i] == ')') {
if (a - b == 1) { //此为特殊情况
temp = a;
}
a++;
}
else b++;
if (a == b) {
a = 0;
b = 0;
temp = 0;
}
}
}
else {
a = 0;
}
cout << a -temp;
return 0;
}