AcWing-5136. 平衡括号字符串

这个题目对于最后一个#后面的符号需要进行特殊判断
尤其需要注意
……))(
这种情况,应该从后往前进行判断,保证每一个 ( 都有一个 )
和它进行匹配

#include 
using namespace std;
#define ll long long
#define sf(x) scanf("%d", &x);
#define de(x) cout << x << " ";
#define Pu puts("");
const int N = 1e5 + 10;
int n, m, ans;
char s[N];
int a[N];
int main() {
    scanf("%s", s);
    n = strlen(s);
    int count = 0;  // 记录#的个数

    int poi = -1;  // 记录最后一个#出现的位置

    for (int i = n - 1; i >= 0; i--) {
        if (s[i] == '#') {
            if (poi == -1)
                poi = i;
            count++;
        }
    }
    int flag = 0;
    int l = 0;
    for (int i = 0; i < poi; i++) {
        if (s[i] == '(')
            l++;
        else if (s[i] == ')' || s[i] == '#')
            l--;
        // 判断在poi之前是否出现(数量小于)的情况
        if (l < 0) {
            flag = -1;
        }
    }
    int r = 0;
    // 从后往前遍历,保证每一个(都有相应的)和它匹配
    // 要不然如果从前往后的话,有可能出现……))(
    for (int i = n; i >= poi + 1; i--) {
        if (s[i] == '(')
            r++;
        else if (s[i] == ')')
            r--;
        if (r > 0) {
            flag = -1;
        }
    }
    // 判断在poi之后的所有()是否出现前者大的情况
    if (flag == -1 || (-r >= l)) {
        cout << "-1\n";
        return 0;
    }

    for (int i = 1; i < count; i++) {
        de(1) Pu;
    }
    cout << (l + r) << endl;
    return 0;
}

你可能感兴趣的:(AcWing,算法)