Удалить внешние скобки
Корректная строка из скобок либо пустая
(""), либо "(" + 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:
Дано: "()()" Результат: "" Пояснение: Исходная строка "()()" = "()" + "()". После удаления внешних скобок в каждом элементе декомпозции, мы получаем результат: "" + "" = "".
Ограничения:
S.length <= 10000S[i]is"("or")"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(); // возвращаем буфер результата, преобразованный в строку
}
Комментарии
Отправить комментарий