Удалить внешние скобки

Корректная строка из скобок либо пустая (""), либо "(" + A + ")", либо A + B, где A и B - это коррекстные строки, а + представляет собой операцию конкатенации.  Например, """()""(())()", и "(()(()))" - корректные строки со скобками.
корректная строка S со скобками называется примитивной, если она не пустая, и не существет ещё разделения S = A+B, с A и B непустые корректсные строки со скобками.
Дана корректная строка со скобками S, допустим, у неё есть притимная декомпозиция: S = P_1 + P_2 + ... + P_k, где P_i - примитивные корректные строки со скобками.
Вернуть S, в которой удалены внешние скобки каждой примитивной подстроки в декомпозиции.

Пример 1:
Дано: "(()())(())"
Результат: "()()()"
Появнение: 
Исходная строка "(()())(())" может быть декомпонована в примитивные строки так: "(()())" + "(())".
После удаления внешних скобок в каждом элементе декомпозции, мы получаем результат: "()()" + "()" = "()()()".
Пример 2:
Дано: "(()())(())(()(()))"
Результат: "()()()()(())"
Пояснение: 
Исходная строка "(()())(())(()(()))" и декомпозиция: "(()())" + "(())" + "(()(()))".
После удаления внешних скобок в каждом элементе декомпозции, мы получаем результат: "()()" + "()" + "()(())" = "()()()()(())".
Пример 3:
Дано: "()()"
Результат: ""
Пояснение: 
Исходная строка "()()" = "()" + "()".
После удаления внешних скобок в каждом элементе декомпозции, мы получаем результат: "" + "" = "".

Ограничения:
  1. S.length <= 10000
  2. S[i] is "(" or ")"
  3. S корректная строка со скобками
Идея решения

Установим счётчик на скобки: каждая открывающая скобка увеличивает скобку, а каждая закрывающая - уменьшает.
Сканируем исходную строку слева направо и работаем со счётчиком, а также параллельно печатаем вывод.
Если у нас открвающая скобка, а счётчик равен нулю, то, очевидно, это внешняя скобка примитивной подстроки, и мы можем её пропустить.
Аналогично, если мы встретили закрывающую скобку, уменьшили счётчик и обнаружили, что счётчик приравнялся к нулю, то мы встретили внешнюю закрывающую скобку - и поэтому не печатаем её в результат.

Компилируемое решение

public String removeOuterParentheses(String S) {
        StringBuffer sb = new StringBuffer(); // сюда печатаем результат
        int count = 0; // счётчик
        for (int i = 0; i < S.length(); i++) { // сканируем строку слева направо
            char c = S.charAt(i); //  проверяем очередной символ
            if (c=='(') { //  если это открывающая скобка
                if (count>0) { // и счётчик не равен нулю, то это НЕ внешняя скобка
                    sb.append(c); // заносим символ в буфер результата
                }
               count++; // увеличиваем счётчик в любом случае при открывающей скобке
            } else if (c==')') { // если же это закрывающая скобка
                if (count!=1) { // и счётчик больше 1, то это НЕ внешняя закрывающая скобка
                   sb.append(c); // выводим символ в буфер результата
                }
                count--; // и в любом случае уменьшаем счётчик при закрывающей скобке
// он станет 0, если скобка была внешней
            }
        }
        return sb.toString(); // возвращаем буфер результата, преобразованный в строку
    }

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком