#include<bits/stdc++.h>
using namespace std;
vector<char> S;
int main() {
    string str;
    cin >> str;
    for (int i = 0; i < str.size(); i++) {
        S.push_back(str[i]);
    }
    bool minB = true;
    while (minB) {
        minB = false;
        for (int i = 0; i < str.size(); i++) {
            if (S[i] == '(') {
                for (int j = i + 1 ; j < str.size(); j++) {
                    if (S[j] == '(' || S[j] == '[' || S[j] == ']') {
                        break;
                    }
                    if (S[j] == ')') {
                        S[i] = ' ';
                        S[j] = ' ';
                        minB = true;
                        break;
                    }
                }
            } else if (S[i] == '[') {
                for (int j = i + 1 ; j < str.size(); j++) {
                    if (S[j] == '(' || S[j] == '[' || S[j] == ')') {
                        break;
                    }
                    if (S[j] == ']') {
                        S[i] = ' ';
                        S[j] = ' ';
                        minB = true;
                        break;
                    }
                }
            }
        }
    }
    for (int i = 0; i < str.size(); i++) {
        if (S[i] == '(' || S[i] == ')' || S[i] == '[' || S[i] == ']') {
            cout << "false";
            return 0;
        }
    }
    cout << "true";
    return 0;
}

总之就是找最小的括号,遇到不匹配的括号就break,遇到匹配的就把括号变成空格,然后一直循环直到没有找到最小括号。

最后要是还剩括号就不合法