Подскажите алгоритм, который перебирает все возможные сочетания скобок в выражениях

пример

Нужен алгоритм, который перебирает все возможные сочетания скобок в выражениях, я придумал рекурсивный метод, но он углубляется (спускается) в подстроки со скобками (...(...)...). Т.е. он в принципе не генерирует строки вида (a+b)+(c+d). На данном этапе придумал 1 неполное решение, которе, уверен, можно допилить: начиная с последнего вхождения '(', заканчивая первым ')' пробегать и вставлять в строку скобки НО таким образом, повторюсь генерируются выражения исключительно со вложенными скобками ((((((...)))))), никак не (((...)(...))), которые тоже имеют место быть. И второе решение, которое работает, но (на мой взгляд) не эффективно по памяти: вместо скобок для каждого выражения хранить последовательность действий, но памяти так расходуется вдвое больше.

@SuppressWarnings("unused") // 1е решение (второе удалил :D)
private String buildBrackets(String in) throws IOException {
    if (in.lastIndexOf('(') + 1 != in.indexOf(')')) {
        outer:
        for (int i = in.lastIndexOf('(') + 1; i < in.indexOf(')') - 1; i++) {
            for (int j = i + 1; j < in.indexOf(')') + 1; j++) {
                
                StringBuilder sb = new StringBuilder();
                sb.append(in.subSequence(0, i));
                
                try {
                    if (!Character.isDigit(sb.charAt(i - 1))) {
                        sb.append('(');
                    } else {
                        continue outer;
                    }
                } catch (Exception e) {}
                
                sb.append(in.subSequence(i, j));
                
                try {
                    if (Character.isDigit(sb.charAt(j))) {
                        sb.append(')');
                    } else {
                        continue;
                    }
                } catch (Exception e) {}
                
                sb.append(in.subSequence(j, in.length()));
                
                bw.write(sb.toString() + '\n');
                
                //return buildBrackets(sb.toString());
            }
        }
    }
    
    return null;
}

Ответы (0 шт):