Количество неубывающей числовой строки, образованной заменой подстановочного знака '?'
Опубликовано: 21 Сентября, 2022
Дана строка S размера N , состоящая из цифр и ? , задача состоит в том, чтобы найти количество строк, образованных таким образом, что замена символа '?' с любыми цифрами, чтобы цифры строки стали неубывающими.
Примеры:
Input: S = “1???2”
Output: 4
Explanation:
The string after valid replacements of ‘?’ is 11112, 11122, 11222, 12222. Therefore, the count of such string is 1.Input: S = “2??43?4”
Output: 0
Подход: Данную проблему можно решить, заменив '?' со всеми возможными допустимыми комбинациями цифр, используя рекурсию, и сохраните перекрывающиеся подзадачи в таблице dp[]. Выполните следующие шаги, чтобы решить данную проблему:
- Инициализируйте 2D-массив, скажем, dp[][] таким образом, что dp[i][j] будет обозначать возможное количество допустимых строк, имеющих длину i и между двумя числами, разность конечных точек которых равна j . Как разные сегменты, содержащие ? независимы друг от друга. Таким образом, общее количество будет произведением всех вариантов, доступных для каждого сегмента.
- Инициализируйте dp[][] как -1.
- Объявите три переменные L как 0 , R как 9 , cnt , так что L обозначает левый предел сегмента, R обозначает правый предел сегмента, а cnt обозначает длину непрерывного '?' персонажи.
- Пусть общее количество будет сохранено в переменной, скажем , как 1 .
- Определите функцию решения , которая будет рекурсивно вычислять значения узлов dp . Функция решения будет принимать два аргумента (len, gap) , len будет обозначать общую длину непрерывного '?' а разрыв будет обозначать разницу между конечными точками этого сегмента как:
- Выполните итерацию для каждого возможного пробела и пересчитайте ответ с помощьюsolve(len — 1, gap — i) .
- Вернуть ответ, полученный от функции решения после заполнения узла dp[len][gap] .
- Переберите каждый символ в строке и выполните следующие шаги:
- Если текущий символ '?' затем увеличивает переменную cnt .
- Если текущий символ не является числом, измените правый предел, т.е. R на текущий символ, т.е. R = S[i] – '0' .
- Умножьте результат, вычисленный рекурсивной функциейsolve (cnt,R – L) .
- После выполнения вышеуказанных шагов выведите значение ans как результирующее количество сформированных строк.
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O(N*10)
Вспомогательное пространство: O (N * 10)