У меня есть следующий код для решения Хакерранк.
public static void main(String[] args) {
System.out.println(isBalanced("{(([])[])[]}"));
}
public static String isBalanced(String s) {
Stack<Character> stack = new Stack<>();
stack.push(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
Character c = s.charAt(i);
Character cStack = stack.peek();
if (cStack == '{' && c == '}'
|| cStack == '[' && c == ']'
|| cStack == '(' && c == ')') {
stack.pop();
} else {
stack.push(c);
}
}
if (stack.isEmpty())
return "YES";
return "NO";
}
Хотя кажется, что код работает без проблем, он выдает следующую ошибку на странице Hackerrank. Я уже тестирую ввод в моей локальной среде IDE как есть {(([])[])[]}
, но я не уверен, нужно ли мне получать последний элемент (может быть, из-за того, что я получил его через Character cStack = stack.peek();
, а затем stack.pop();
.
Итак, не могли бы вы взглянуть и протестировать этот код на странице Хакерранк и сообщить мне, что не так?
Обновлять:
public static String isBalanced(String s) {
Stack<Character> stack = new Stack<>();
stack.push(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
Character c = s.charAt(i);
if (c == '{' || c == '[' || c == '(') {
stack.push(c);
} else if (stack != null) {
Character cStack = stack.peek();
if (cStack == '{' && c == '}'
|| cStack == '[' && c == ']'
|| cStack == '(' && c == ')') {
stack.pop();
}
}
}
if (stack.isEmpty())
return "YES";
return "NO";
}
Перед вызовом stack.peek()
нужно проверить, пуст стек или нет. Вызов pop()
или peek()
для пустого стека вызовет ошибку.
Если текущий символ является открывающей скобкой, вам даже не нужно проверять вершину стека. Если это закрывающая скобка, то сначала проверьте, пуст ли стек или нет. Если это так, верните false. В противном случае сравните верхний символ и примите решение.
@Downed_Voters Любой комментарий, если у вас есть идея оставить комментарий?
@Jack добавьте свой отредактированный подход к вопросу
Добавлено как обновление
@Поднимите блок else if, сначала проверьте, пуст ли стек, затем выполните Character cStack = stack.peek()
, а затем проверьте остальные операторы.
Я изменил, но выдает неправильный результат. См. обновленный код, пожалуйста.
@Jack добавьте блок else
к условию if (cStack == '{' && c == '}'
, где вы сразу же вернетесь "NO"
Вы имеете в виду последнюю строку? Если да, то боюсь не получится
Давайте продолжить обсуждение в чате.
Хорошо, я исправил своего друга, добавив дополнительный блок else
. Большое спасибо.
Большое спасибо за вашу помощь. Я пробовал, но все равно та же ошибка. Не могли бы вы опубликовать обновленный код после тестирования на Hackerrank?