fix: updated LCS problem stament and tutorial
This commit is contained in:
@@ -64,4 +64,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.\end{document}
|
||||
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.\end{document}
|
||||
|
||||
Reference in New Issue
Block a user