Сопоставление круглых скобок — распространенная проблема в информатике, когда нам нужно определить, сбалансирована ли строка круглых скобок или нет. Однако все становится интереснее, когда мы добавляем в уравнение звездочки (*). В этой статье мы рассмотрим различные методы решения проблемы проверки строки в скобках со звездочками, а также приведем примеры кода.
Метод 1: грубый перебор (рекурсивный)
Один из подходов заключается в исчерпывающем переборе всех возможностей путем рекурсивной замены каждой звездочки открывающей или закрывающей круглой скобкой и проверки корректности полученной строки. Вот пример реализации на Python:
def is_valid(s):
return check_valid(s, 0, 0)
def check_valid(s, i, count):
if count < 0:
return False
if i == len(s):
return count == 0
if s[i] == '(':
return check_valid(s, i + 1, count + 1)
elif s[i] == ')':
return check_valid(s, i + 1, count - 1)
elif s[i] == '*':
return check_valid(s, i + 1, count + 1) or check_valid(s, i + 1, count - 1) or check_valid(s, i + 1, count)
return False
Метод 2: жадный подход
Другой метод — использовать жадный подход, при котором мы сохраняем нижнюю и верхнюю границу количества открывающихся скобок. Если встречается звездочка, мы увеличиваем верхнюю границу и уменьшаем нижнюю границу. Границы обновляются на основе встречающихся скобок. Вот пример реализации на Python:
def is_valid(s):
lo = hi = 0
for char in s:
lo += 1 if char == '(' else -1
hi += 1 if char != ')' else -1
if hi < 0:
break
lo = max(lo, 0)
return lo == 0
Метод 3: динамическое программирование
Мы также можем решить эту проблему с помощью динамического программирования. Мы создаем матрицу, где dp[i][j]представляет, является ли подстрока от индекса от iдо jдопустимой строкой в круглых скобках. Матрица заполняется по диагонали слева направо. Вот пример реализации на Python:
def is_valid(s):
n = len(s)
dp = [[False] * n for _ in range(n)]
for i in range(n):
if s[i] == '*':
dp[i][i] = True
for length in range(2, n + 1):
for i in range(n - length + 1):
j = i + length - 1
if (s[i] == '(' or s[i] == '*') and (s[j] == ')' or s[j] == '*'):
if length == 2 or dp[i + 1][j - 1]:
dp[i][j] = True
continue
for k in range(i, j):
if dp[i][k] and dp[k + 1][j]:
dp[i][j] = True
break
return dp[0][n - 1]
В этой статье мы рассмотрели три различных метода проверки строки в скобках со звездочками. Каждый метод имеет свои преимущества и сложности. Подход грубой силы прост, но может быть неэффективен для больших входных данных. Жадный подход более эффективен и может обрабатывать большие входные данные. Подход динамического программирования является наиболее эффективным, но требует больше кода. В зависимости от конкретных требований и ограничений вашей проблемы вы можете выбрать наиболее подходящий метод.
При выборе подхода не забывайте учитывать компромисс между эффективностью и простотой. Приятного кодирования!