#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
.