Я думаю, вы можете использовать прокручивающую хеш-функцию , как у Рабина Карпа. Таким образом, вы можете вычислить новые значения хеш-функции более длинных общих подпоследовательностей без необходимости повторной генерации всей строки и ее хеширования.
На самом деле, я думаю, что вы можете использовать чистый DP, чтобы найти свой ответ. Предположим, вы уже вычислили значения таблицы DP для LCS (я думаю, что в вашем коде memo[][]
). Затем вы можете рассчитать количество различных экземпляров LCS, как это
for j ← 0 to n do
for i ← 0 to m do
if i = 0 or j = 0 then
D[i, j] ← 1
else
D[i, j] ← 0
if ai = bj then
D[i, j] ← D[i − 1, j − 1]
else if L[i − 1, j] = L[i, j] then
D[i, j] ← D[i, j] + D[i − 1, j]
endif
if L[i, j − 1] = L[i, j] then
D[i, j] ← D[i, j] + D[i, j − 1]
endif
if L[i − 1, j − 1] = L[i, j] then
D[i, j] ← D[i, j] − D[i − 1, j − 1]
endif
end if
endfor
endfor
Ваш ответ D [n, m].
Надеюсь, что мои идеи помогли!