#algorithm
#алгоритм
Вопрос:
Например: у нас есть последовательность «(()(()))», тогда ответ равен 0 (ну, это сбалансированная последовательность скобок).
Допустим, у нас есть такая последовательность: «)) (((«, тогда оптимальное число для удаления будет равно 5 (нет другого способа сделать его сбалансированным, кроме удаления их всех)
Если у нас есть такая последовательность: «())(()», тогда ответом будет 2 (давайте удалим третий и четвертый).
Комментарии:
1. Кстати, входная последовательность не может быть длиннее 100000
Ответ №1:
вот одно из возможных решений:
- начните с начала с переменной
count = 0
, которая подсчитывает «открытые» скобки иneeded = 0
количество скобок, которые вам нужно сбалансировать - каждый раз, когда вы находите
(
добавить 1 кcount
- каждый раз, когда вы находите
)
:
еслиcount == 0
тогда вам нужны открытые скобки раньше, поэтому вы делаетеneeded = needed = 1
что-то еще, уменьшайте количество найденных открытых скобокcount = count - 1;
- в конце добавьте количество оставшихся открытых скобок к необходимому, потому что вам нужны
count
заключительные закрывающие скобки:needed = needed count
в конце:
count(string)
count = needed = 0
for i = 0 to string.length
if string[i] == '('
count = count 1
else if string[i] == ')'
if count == 0
needed = needed 1
else
count = count - 1
return count needed
Ответ №2:
Вы можете поместить открытые символы в стек, и когда вы столкнетесь с закрытым символом, если стек не пуст, извлеките элемент из стека, если он сбалансирован, иначе увеличьте количество. После итерации добавьте оставшиеся символы, присутствующие в стеке.
private static int getCount(String input) {
char open = '(';
int charsToDelete = 0;
Stack<Character> characterStack = new Stack<>();
for (int i=0;i<input.length();i ) {
char ch = input.charAt(i);
if (ch == open) {
characterStack.push(ch);
} else {
if (!characterStack.isEmpty()) {
char pop = characterStack.peek();
if (pop == '(') {
characterStack.pop();
} else {
charsToDelete ;
}
} else {
charsToDelete ;
}
}
}
while (!characterStack.isEmpty()) {
characterStack.pop();
charsToDelete ;
}
return charsToDelete;
}