В мире информатики понятие справедливости часто возникает при работе со строками. Справедливая строка — это строка, которая имеет одинаковое количество «0» и «1» в каждой подстроке длины «n». В этой статье мы рассмотрим различные методы определения корректности данной строки. Мы будем использовать разговорный язык и приводить примеры кода, чтобы облегчить понимание концепций. Итак, приступим!
Метод 1: подход грубой силы
Подход грубой силы включает в себя проверку каждой подстроки длины «n» в данной строке и подсчет количества «0» и «1» в каждой подстроке. Если счетчики одинаковы для всех подстрок, то строка является справедливой. Вот реализация Python:
def is_fair_brute_force(s, n):
for i in range(len(s) - n + 1):
substring = s[i : i + n]
zeros = substring.count('0')
ones = n - zeros
if zeros != ones:
return False
return True
Метод 2: метод префиксной суммы
Метод префиксной суммы можно использовать для оптимизации описанного выше подхода. Мы можем предварительно вычислить совокупное количество нулей и единиц в данной строке. Затем для каждой подстроки мы можем вычислить количество «0» и «1», вычитая совокупное количество. Если счетчики равны, строка является справедливой. Вот реализация Python:
def is_fair_prefix_sum(s, n):
cum_zeros = [0]
cum_ones = [0]
for i in range(len(s)):
cum_zeros.append(cum_zeros[i] + (s[i] == '0'))
cum_ones.append(cum_ones[i] + (s[i] == '1'))
for i in range(n, len(s) + 1):
zeros = cum_zeros[i] - cum_zeros[i - n]
ones = cum_ones[i] - cum_ones[i - n]
if zeros != ones:
return False
return True
Метод 3: Техника скользящего окна
Техника скользящего окна позволяет дополнительно оптимизировать подход суммы префиксов за счет использования скользящего окна размера «n». Мы можем поддерживать количество «0» и «1» в окне и перемещать окно по строке. Если в какой-то момент счетчики станут неравными, строка будет несправедливой. Вот реализация Python:
def is_fair_sliding_window(s, n):
zeros = 0
ones = 0
for i in range(n):
if s[i] == '0':
zeros += 1
else:
ones += 1
if zeros != ones:
return False
for i in range(n, len(s)):
if s[i - n] == '0':
zeros -= 1
else:
ones -= 1
if s[i] == '0':
zeros += 1
else:
ones += 1
if zeros != ones:
return False
return True
В этой статье мы рассмотрели три различных метода определения достоверности заданной строки. Мы начали с подхода грубой силы, затем оптимизировали его с помощью метода суммирования префиксов и, наконец, усовершенствовали его с помощью метода скользящего окна. Каждый метод имеет свои преимущества и компромиссы с точки зрения временной и пространственной сложности. Понимая эти методы, вы сможете эффективно решать проблемы, связанные с проверкой корректности строк.