Самая длинная общая подпоследовательность - это классическая проблема, обычно решаемая методом динамического программирования.
Рекурсивное отношение для строк S, T равно:
/*Characters do not match*/
if(S[i]!=T[j])
return max(LCS(i+1, j, S, T), LCS(i, j+1, S, T));
else
return LCS(i+1, j+1, S, T) + 1;
Здесь i
представляет индекс строки S и j
строки T. В любом состоянии (i, j)
возможны сценарии, либо символы совпадают, либо не совпадают.
- Если символы не совпадают, у нас есть два возможных варианта. Либо выберите следующий символ S или выберите следующий символ T и возьмите лучшее из обоих решений.
- Если символы совпадают, переходите к следующему символу обеих строк.
Аналогично это можно решить для подстроки