Senior
/*Dany jest ciąg znaków, konieczne jest zaimplementowanie funkcji do sprawdzania poprawności wskazania nawiasów. Każdy nawias otwierający musi mieć odpowiadający mu nawias zamykający. Nawiasy otwierające i zamykające muszą występować w poprawnej kolejności. Typy nawiasów: "{", "}", "(", ")", "[", "]". Input: "([]){}[(()())()]" Wynik: true Input: "[(])" Wynik: false Ponieważ nawiasy 2 i 3 są niepoprawnie wskazane, zamykający ']' pojawia się przed zamykającym '(' */ public boolean check(String s){ Deque<Character> stack = new ArrayDeque<>(); Map<Character, Character> map = Map.of( ')', '(', ']', '[', '}', '{' ); // ((( for( char c : s.toCharArray()){ if(map.containsValue(c)){ stack.push(c); } else if(map.containsKey(c)){ if( stack.isEmpty() || stack.pop() != map.get(c)){ return false; } } } return stack.isEmpty(); }
sobes.tech AI
Odpowiedź od AI
Предложенная функция на Java корректно проверяет правильность расстановки скобок с помощью стека и отображения закрывающих скобок на соответствующие открывающие.
Основная идея:
- При встрече открывающей скобки кладём её в стек.
- При встрече закрывающей — проверяем, что верхний элемент стека соответствует ей.
- Если нет соответствия или стек пуст, возвращаем false.
- В конце проверяем, что стек пуст (все скобки закрыты).
Пример реализации на Kotlin:
fun check(s: String): Boolean {
val stack = ArrayDeque<Char>()
val map = mapOf(')' to '(', ']' to '[', '}' to '{')
for (c in s) {
if (c in map.values) {
stack.push(c)
} else if (c in map.keys) {
if (stack.isEmpty() || stack.pop() != map[c]) {
return false
}
}
}
return stack.isEmpty()
}
Этот код корректно обрабатывает вложенные и последовательные скобки, например:
println(check("([]){}[(()())()]") ) // true
println(check("[(])")) // false