Учитывая две строки символов нижнего алфавита, нам нужно найти количество способов вставить символ в первую строку, чтобы длина LCS обеих строк увеличилась на один.
Примеры:
Input : str1 = “abab”, str2 = “abc” Output : 3 LCS length of given two strings is 2. There are 3 ways of insertion in str1, to increase the LCS length by one which are enumerated below, str1 = “abcab” str2 = “abc” LCS length = 3 str1 = “abacb” str2 = “abc” LCS length = 3 str1 = “ababc” str2 = “abc” LCS length = 3 Input : str1 = “abcabc”, str2 = “abcd” Output : 4
Идея состоит в том, чтобы попробовать все 26 возможных символов в каждой позиции первой строки, если длина str1 равна m, тогда новый символ может быть вставлен в (m + 1) позиции, теперь предположим, что в любое время символ c вставляется в i-ю позицию в str1 тогда мы сопоставим его со всеми позициями, имеющими символ c в str2. Предположим, что одной такой позицией является j, тогда, чтобы общая длина LCS была на одну больше, чем предыдущая, должно удовлетворять условие ниже,
LCS(str1[1, m], str2[1, n]) = LCS(str1[1, i], str2[1, j-1]) + LCS(str1[i+1, m], str2[j+1, n])
Вышеприведенное уравнение гласит, что сумма LCS подстрок суффикса и префикса при вставленном символе должна совпадать с общей суммой LCS строк, поэтому, когда один и тот же символ вставляется в первую строку, он увеличивает длину LCS на единицу.
В приведенном ниже коде два 2D-массива, lcsl и lcsr используются для хранения LCS префикса и суффикса строк соответственно. Способ заполнения этих 2D массивов можно найти здесь .
Пожалуйста, смотрите код ниже для лучшего понимания,
|
Джава
|
python3
|
Выход:
4
Сложность времени: O (мн)
Вспомогательное пространство: O (млн)
Эта статья предоставлена Уткаршем Триведи . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Количество способов вставить символ для увеличения LCS на один
- Количество подстрок длины n возможно из заданной строки
- Максимальное количество подстрок длины K, состоящих из одинаковых символов
- Подсчитайте количество двоичных строк, чтобы во всех единицах не было подстроки длиной больше или равной 3
- Массив строк в C ++ (3 различных способа создания)
- Количество строк, которые становятся равными одной из двух строк после одного удаления
- Количество способов сделать двоичную строку длины N такой, чтобы 0 всегда встречались вместе в группах размера K
- Подстроки длины K, содержащие одинаковый символ
- Проверьте, все ли палиндромные подстроки имеют нечетную длину
- Все возможные строки любой длины, которые могут быть сформированы из данной строки
- Количество способов разделить строку на подстроки, чтобы сделать их в лексикографически возрастающей последовательности
- Количество строк длины N без палиндромной подстроки
- Генерация двоичных строк длины N с использованием Branch и Bound
- Количество двоичных строк длины N с K смежными битами набора
- Генерация всех двоичных строк длины n с подстрокой 01, которая появляется ровно дважды
0.00 (0%) 0 votes