\chapter{Longest common subsequence}

Let $S_{1} = \text{ATCTGAT}$ and $S_{2} = \text{TGCATA}$.
In this case the longest common subsequence of $S_{1}$ and $S_{2}$ is $TCTA$.
\begin{algorithm}
    \caption{Construct a longest common subsequence matrix}
    \begin{algorithmic}[1]
        \Function{LCSQ\_Matrix}{$S_{1}$: Array($n$), $S_{2}$: Array($m$)}
        \State $M \gets $ Array($m+1$, $n+1$)
        \For{($i = 0$; $i < n+1$; $i++$)}
            \For{$j = 0$; $j < m+1$; $j++$}
                \If {$i = 0$ or $j = 0$}
                    \State $M[i][j] = 0$
                    \Else
                    \If {$S_{1}[i] = S_{2}[j]$}
                        \State $match = M[i-1][j-1] + 1$
                        \Else
                        \State $match = M[i-1][j-1]$
                    \EndIf
                    \State $gap_{1} = M[i-1][j]$
                    \State $gap_{2} = M[i][j-1]$
                    \State $M[i][j] = \max \{ match, gap_{1}, gap_{2}\}$
                \EndIf
            \EndFor
        \EndFor
        \State \Return $M$
        \EndFunction
    \end{algorithmic}
\end{algorithm}

\begin{algorithm}
    \caption{Construct a longest common subsequence matrix keeping the path in memory}
    \begin{algorithmic}[1]
        \Function{LCSQ\_Matrix\_Path}{$S_{1}$: Array($n$), $S_{2}$: Array($m$)}
        \State $M \gets $ Array($m+1$, $n+1$)
        \State $P \gets $ Array($m+1$, $n+1$)
        \For {($i = 0$; $i < n+1$, $i++$)}
            \State $M[i][0] \gets 0$
        \EndFor
        \For {($j = 0$; $j < m+1$; $j+$)}
            \State $M[0][j] \gets 0$
        \EndFor
        \For{($i = 1$; $i < n+1$; $i++$)}
        \For{($j = 1$; $j < m+1$; $j++$)}
        \If {$i = 1$ or $j = 0$}
        \State $M[i][j] = 0$
        \Else
        \If {$S_{1}[i-1] = S_{2}[j-1]$}
            \State $M[i][j] \gets M[i-1][j-1] + 1$
            \State $P[i][j] \gets '\nwarrow'$
        \ElsIf {$M[i][j-1] \geq M[i-1][j]$}
            \State $M[i][j] \gets M[i][j-1]$
            \State $P[i][j] \gets '\leftarrow'$
            \Else
            \State $M[i][j] \gets M[i-1][j]$
            \State $P[i][j] \gets '\downarrow'$
        \EndIf
	\EndIf
        \EndFor
        \EndFor
        \State \Return $M, P$
        \EndFunction
    \end{algorithmic}
\end{algorithm}

\begin{algorithm}
    \caption{Backtrack the longest common subsequence}
    \begin{algorithmic}[1]
        \Function{LCSQ}{$S_{1}$: Array($n$), $S_{2}$: Array($m$)}
        \State $M, P \gets $ \Call{LCSQ\_Matrix}{$S_{1}$, $S_{2}$}
        \State $L \gets Array(M[n][m])$
        \State $k \gets 0$
        \State $i \gets n$
        \State $j \gets m$
        \While{$i > 0$ and $j > 0$}
            \If {$P[i][j] = '\nwarrow' $}
                \State $L[k] \gets S_{1}[i]$
                \State $i--$
                \State $j--$
                \State $k++$
            \ElsIf {$P[i][j] = '\leftarrow'$}
                \State $j--$
                \Else
                \State $i--$
            \EndIf
        \EndWhile
        \State \Return $L$
        \EndFunction
    \end{algorithmic}
\end{algorithm}

\iffalse
    \begin{algorithm}
        \caption{Recursive reconstruction of the longest common subsequence}
        \begin{algorithmic}[1]
            \Procedure{LCSQ}{$S_{1}$: Array($n$), $S_{2}$: Array($m$)}
            \State $M, P \gets $ \Call{LCSQ\_Matrix}{$S_{1}$, $S_{2}$}
            \State $i \gets n$
            \State $j \gets m$
            \State \Call{Aux}{$P$, $S_{1}$, $i$, $j$}
            \EndProcedure

            \Procedure{Aux}{$P$: Array($n+1$, $m+1$), $S_{1}$: Array($n$), $i$, $j$}
            \If {$P[i][j] = '\nwarrow' $}
                \State $l \gets S_{1}[i]$
                \State \Call{Aux}{$P$, $S_{1}$, $i-1$, $j-1$}
                \State \texttt{print}($l$)
            \ElsIf {$P[i][j] = '\leftarrow'$}
                \State \Call{Aux}{$P$, $S_{1}$, $i$, $j-1$}
                \Else
                \State \Call{Aux}{$P$, $S_{1}$, $i-1$, $j$}
            \EndIf
            \EndProcedure
        \end{algorithmic}
    \end{algorithm}
\fi
