Достижение справедливости: изучение нескольких методов проверки честности строки

В мире информатики понятие справедливости часто возникает при работе со строками. Справедливая строка — это строка, которая имеет одинаковое количество «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

В этой статье мы рассмотрели три различных метода определения достоверности заданной строки. Мы начали с подхода грубой силы, затем оптимизировали его с помощью метода суммирования префиксов и, наконец, усовершенствовали его с помощью метода скользящего окна. Каждый метод имеет свои преимущества и компромиссы с точки зрения временной и пространственной сложности. Понимая эти методы, вы сможете эффективно решать проблемы, связанные с проверкой корректности строк.