\chapter{Motif} \begin{algorithm} \caption{Brute-force search of a motif in a sequence} \begin{algorithmic}[1] \Function{FindMotif}{$S$: Array($n$), $M$: Array($m$)} \Returns{a list of position} \State $pos \gets \{\}$ \State $i \gets 0$ \While {$i < n - m + 1$} \State $j \gets 0$ \While {$j < m$ and $S[i+j] = M[j]$} \State $j++$ \EndWhile \If {$j = m$} \State $pos \gets pos \cup \{i\}$ \EndIf \State $i++$ \EndWhile \State \Return $pos$ \EndFunction \end{algorithmic} \label{alg:naive-motif-matching} \end{algorithm} \begin{algorithm} \caption{Knuth-Morris-Pratt algorithm} \begin{algorithmic}[1] \Function{KMP\_Search}{$S$: Array($n$), $M$: Array($m$)} \Returns{Integer} \State $table \gets$ \Call{KMP\_Table}{$M$} \State $c \gets 0$ \Comment{Count the number of matches} \State $i \gets 0$ \State $j \gets 0$ \While {$i < n$} \If{$S[i] = M[i]$} \State $i \gets i + 1$ \State $j \gets j + 1$ \EndIf \If {$j = m$} \State $c \gets c + 1$ \State $j \gets table[j-1]$ \ElsIf {$j < n$ and $M[j] \neq S[i]$} \If {$j \neq 0$} \State $j \gets table[j-1]$ \Else \State $i \gets i + 1$ \EndIf \EndIf` \EndWhile \State \Return $c$ \EndFunction \Function{KMP\_Table}{M: Array(m)} \State \textbf{Returns} Array(m) \State $previous \gets 0$ \State $table \gets $ array of zeros of size m \For {$i = 0$; $i < m$; $i++$} \If {$M[i] = M[previous]$} \State $previous \gets previous + 1$ \State $table[i] \gets previous$ \State $i \gets i + 1$ \Else \If {$previous = 0$} \State $previous \gets table[previous - 1]$ \Else \State $table[i] \gets 0$ \State $i \gets 1$ \EndIf \EndIf \EndFor \EndFunction \end{algorithmic} \end{algorithm}