Подсчет N-значных чисел, не имеющих префиксов

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

Учитывая целое число N и вектор префиксов строк [], задача состоит в том, чтобы вычислить общее количество возможных строк длины N от символов '0' до '9' . так что данные префиксы нельзя использовать ни в одной из строк.

Примеры:

Input: N = 3, prefixes = {“42”}
Output: 990
Explanation: All string except{“420”, “421”, “422”, “423”, “424”, “425”, “426”, “427”, “428”, “429”} are valid.

Input: N = 5, prefixes[] = { “0”, “1”, “911” }
Output: 79900

Подход: общее количество возможных строк с длиной равно (10^N) , так как для каждого места в строке есть 10 вариантов выбора символа. Вместо подсчета общего количества хороших строк вычтите общее количество плохих строк из общего количества строк. Перед повторением префиксов объединение префиксов с тем же начальным символом, что и префикс большей длины, может привести к вычитанию некоторых повторений. Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте переменную total как 10 N .
  • Инициализировать карту<int, vector<string>> mp[].
  • Перебрать диапазон [0, M), используя переменную i , и выполнить следующие задачи:
    • Вставьте значение prefixes[i] в вектор карты mp[prefixes[i]-'0'].
  • Инициализируйте вектор new_prefixes[] .
  • Пройдите по карте mp[] с помощью переменной x и выполните следующие задачи:
    • Инициализируйте переменную mn как N .
    • Пройдите вектор x.second, используя переменную p , и выполните следующие задачи:
      • Установите значение mn как минимум mn или p.length() .
    • Пройдите вектор x.second, используя переменную p , и выполните следующие задачи:
      • Если p.length() меньше, чем mn, то вставьте p в вектор new_prefixes[] .
  • Перебрать диапазон [0, new_prefixes.size()) с помощью переменной i и выполнить следующие задачи:
    • Вычтите значение int(pow(10, N – new_prefixes[i].length())+ 0,5) из переменной total.
  • После выполнения вышеуказанных шагов выведите значение total в качестве ответа.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(M), где M — размер векторных префиксов[]
Вспомогательный пробел: O(M*K), где K — максимальная длина строки.