Sobes.tech
Senior

/*Δεδομένης μιας συμβολοσειράς, πρέπει να υλοποιηθεί μια λειτουργία για τον έλεγχο της ορθότητας της ένδειξης των παρενθέσεων. Κάθε ανοιχτή παρένθεση πρέπει να έχει μια αντίστοιχη κλειστή παρένθεση. Οι ανοιχτές και κλειστές παρενθέσεις πρέπει να βρίσκονται σε σωστή σειρά. Τύποι παρενθέσεων: "{", "}", "(", ")", "[", "]". Είσοδος: "([]){}[(()())()]" Αποτέλεσμα: true Είσοδος: "[(])" Αποτέλεσμα: false Επειδή οι παρενθέσεις 2 και 3 δηλώνονται λανθασμένα, το κλείσιμο ']' εμφανίζεται πριν από το κλείσιμο '(' */ 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

Απάντηση από 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