сбалансированный скобочный код — что я делаю не так?

#python

#python

Вопрос:

Я использовал другой подход для решения этой проблемы. Наиболее распространенный способ решить эту проблему — использовать стеки. Я выбрал подход, при котором я считаю открытые круглые скобки «(«, а затем считаю закрытые круглые скобки «)», если числа не совпадают, код вернет false.

Когда я запускаю этот код, он каждый раз возвращает false . Что я делаю не так?

Вот мой текущий код:

     class Solution:
        def isValid(self, s: str) -> bool:
            if len(s)%2 != 0:
                print('false')
                
                
            open_b = s.count("[")
            open_p = s.count("(")
            open_cb = s.count("{")
    
            close_b = s.count("]")
            close_p = s.count(")")
            close_cb = s.count("}")
            if open_b != close_b and open_p != close_p and open_cb != close_cb:
                print('false') 
    
            else:
                print('true') 
  

Вот актуальный вопрос:

Дана строка s, содержащая только символы ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘ и ‘]’, определите, является ли входная строка допустимой.

Входная строка допустима, если:

  • Открытые скобки должны быть закрыты скобками того же типа.
  • Открытые скобки должны быть закрыты в правильном порядке.

Пример 1:

 Input: s = "()"
Output: true
  

Комментарии:

1. Ваша программа также будет печатать True для случая ])}{([ , который тоже должен быть неправильным

Ответ №1:

  • Сначала мы должны написать цикл for:

  • Вот решение с использованием стека, обычно используемое для этого:

 class Solution:
    def isValid(self, base_string):
        memo = {')': '(', '}': '{', ']': '['}
        stack = [0]
        for character in base_string:
            if character in memo:
                if stack.pop() != memo[character]:
                    return False
            else:
                stack.append(character)
        return stack == [0]
  

Ответ №2:

Чтобы ответить на первую проблему на ваш вопрос

когда я запускаю этот код, он каждый раз возвращает false . Что я делаю не так?

Ваша логика для предложения if неверна, поскольку вы используете

if open_b != close_b and open_p != close_p and open_cb != close_cb:

чтобы перевести это на английский, это означает выполнение предложения true, когда все условия выполнены, то есть ни одна скобка не должна совпадать.

В случае open_b == close_b while open_p != close_p и open_cb != close_cb он будет выполнять не предложение true, а предложение false, которое в вашем случае print('true') .

Чтобы исправить это, вы можете просто заменить and на or , т.е.

if open_b != close_b or open_p != close_p or open_cb != close_cb:

ОДНАКО исправление этой проблемы не означает, что ваш скрипт верен, поскольку используемый им алгоритм принципиально не способен обрабатывать случаи, которые имеют одинаковое количество совпадений, но неправильный порядок, например ])}{([ . Поэтому вам все равно нужно придумать другое решение.

Ответ №3:

когда я запускаю этот код, он каждый раз возвращает false . Что я делаю не так?

На самом деле, ваш код ничего не возвращает явно, что означает, что он будет возвращать неявно None , что действительно считается ложным в логическом контексте.

Итак, поскольку вы никогда ничего не возвращаете, вы всегда возвращаете неявно None .