Количество подстрок в двоичной строке, содержащих больше единиц, чем нулей

Опубликовано: 19 Сентября, 2022

Для заданной двоичной строки s задача состоит в том, чтобы вычислить количество таких подстрок, в которых количество единиц строго больше, чем количество нулей .

Примеры

Input: S = “110011”
Output: 11
Explanation: 
Substrings in which the count of 1’s is strictly greater than the count of 0’s are { S[0]}, {S[0], S[1]}, {S[0], S[2]}, {S[0], S[4]}, {S[0], S[5]}, {S[1], S[1]}, {S[1], S[5]}, {S[3], S[5]}, {S[4], S[4]}, {S[4], S[5]}, {S[5], S[5]}.

Input: S = “101”
Output: 3

Наивный подход: самый простой подход к решению проблемы — сгенерировать все подстроки и подсчитать количество единиц и нулей в каждой подстроке. Увеличьте количество тех подстрок, которые содержат количество 1 с больше, чем количество 0 с. Наконец, распечатайте полученное количество.
Временная сложность : O(N 3 )
Вспомогательное пространство: O(1)

Эффективный подход. Описанный выше подход можно оптимизировать с помощью алгоритма сортировки слиянием. Выполните следующие действия:

  • Инициализируйте массив, скажем, nums[] размера n, где n — длина строки.
  • Пересеките строку. Если s[i] == '1' , то сохраните 1 в nums[i] . В противном случае установите nums[i] = -1 .
  • Обновите pref[] для хранения суммы префиксов массива nums[] .
  • Теперь задача сводится к подсчету количества пар(i, j) в массиве pref[] , где pref[i] < pref[j] и i < j , что аналогично подсчету инверсий в массиве с тыла сторона.
  • Верните количество инверсий массива суммы префикса в качестве окончательного ответа.

Ниже приведена реализация описанного выше подхода.


Временная сложность: O(NlogN)
Вспомогательное пространство: O(N)