Sobes.tech
Senior

/*Dato una stringa, è necessario implementare una funzione per verificare la correttezza dell'indicazione delle parentesi. Ogni parentesi aperta deve corrispondere a una parentesi chiusa. Le parentesi aperte e chiuse devono essere in ordine corretto. Tipi di parentesi: "{", "}", "(", ")", "[", "]". Input: "([]){}[(()())()]" Risultato: true Input: "[(])" Risultato: false Perché le parentesi 2 e 3 sono indicate in modo errato, la chiusura ']' si presenta prima della chiusura '(' */ 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

Risposta dell'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