fix: updated LCS problem stament and tutorial

This commit is contained in:
2025-12-09 22:23:28 -03:00
parent 0951a11635
commit efbebaf61e
9 changed files with 112 additions and 16 deletions

View File

@@ -51,4 +51,49 @@ dp[0][j] = 0 \quad \forall j \ge 0
dp[i][0] = 0 \quad \forall i \ge 0
\]
Isto representa que, se uma das strings tiver tamanho zero, nenhuma subsequência comum pode ser formada.
Isto representa que, se uma das strings tiver tamanho zero, nenhuma subsequência comum pode ser formada.
\subsection{Recuperação da Subsequência Comum}
Após o preenchimento da matriz \( dp \), o valor \( dp[n][m] \) fornece o comprimento da maior subsequência comum entre \( s_1 \) e \( s_2 \).
No entanto, para obter também a subsequência em si, é necessário realizar um processo de \textit{backtracking} sobre a matriz.
A ideia consiste em iniciar a partir da posição \( (n, m) \) da matriz e caminhar em direção à origem.
Em cada passo:
\begin{itemize}
\item Se \( s_1[i] = s_2[j] \), então este caractere faz parte da LCS. Nesse caso, retrocedemos para \( (i-1, j-1) \).
\item Caso contrário, avançamos para o vizinho que contém o maior valor entre \( dp[i-1][j] \) e \( dp[i][j-1] \), pois esse vizinho indica o caminho que manteve o comprimento máximo da subsequência.
\end{itemize}
Como a subsequência é reconstruída de trás para frente, os caracteres encontrados devem ser adicionados no início da string resultante.
O algoritmo para recuperar uma subsequência comum de comprimento máximo é o seguinte:
\begin{verbatim}
int i = n; // ponteiro para s1
int j = m; // ponteiro para s2
string lcs = ""; // subsequência comum sendo reconstruída
// Enquanto ainda houver caracteres a considerar
while (i > 0 && j > 0) {
// Caso 1: os caracteres são iguais → fazem parte da LCS
if (s1[i - 1] == s2[j - 1]) {
lcs = s1[i - 1] + lcs; // adiciona no início da string
i--;
j--;
}
// Caso 2: se o valor de cima é maior, movemos para cima
else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
}
// Caso 3: caso contrário, movemos para a esquerda
else {
j--;
}
}
\end{verbatim}
Ao final desse processo, a string \texttt{lcs} conterá uma maior subsequência comum entre as duas strings.