5 of 7 added 161 characters in body

Jelly, 50 40 34 bytes

-6 bytes thanks to Leaky Nun (getting reduce to work where I couldn't)


Plain and inefficient.

Try it online! (times out at TIO for [1,1,1,1] - yes, inefficient.)


Recursively removes pairs of matching brackets that reside right next to each other until no more may be removed for every possible string one may form, keeping such strings which reduce to nothing (hence have all matching content).

“()“{}“[]“<>”©ẋ"FŒ!QµW;®œṣF¥/µÐLÐḟ - Main link: list: [n(), n{}, n[], n<>]
“()“{}“[]“<>”                      - literal ["()", "{}", "[]", "<>"]
             ©                     - copy to register
               "                   - zip with:
              ẋ                    -   repeat list
                F                  - flatten
                 Œ!                - all permutations (yeah, it's inefficient!)
                   Q               - de-duplicate
                    µ              - monadic chain separation (call that a)
                       ®           - recall value from register
                     W             - wrap a in a list
                      ;            - concatenate
                                Ðḟ - filter discard if:
                            µÐL    -   loop until no change:
                           ¥       -     last two links as a dyad:
                        œṣ         -       split on occurrences of sublist (a pair of brackets)
                          F        -       flatten the result