## Introduction to Pattern Searching Algorithms

Updated on 30-Jul-2019 22:30:23
Pattern Searching algorithms are used to find a pattern or substring from another bigger string. There are different algorithms. The main goal to design these type of algorithms to reduce the time complexity. The traditional approach may take lots of time to complete the pattern searching task for a longer text. Here we will see different algorithms to get a better performance of pattern matching. In this Section We are going to cover. Aho-Corasick Algorithm Anagram Pattern Search Bad Character Heuristic Boyer Moore Algorithm Efficient Construction of Finite Automata kasai’s Algorithm Knuth-Morris-Pratt Algorithm Manacher’s Algorithm Naive Pattern Searching Rabin-Karp ... Read More

## Z Algorithm

Updated on 16-Jun-2020 08:13:31
This algorithm is named Z Algorithm because, in this algorithm, we need to create a Z array. The size of the Z array is the same as the text size. This array is used to store the length of longest possible substring starting from the current character of the main string. At first, the pattern and the main text are concatenated with a special symbol which is not present in the text and pattern. If the P is pattern and T is the main text, then after concatenation, it would be P$T (Assuming$ is not present in the P ... Read More

## Trie of all Suffixes

Updated on 15-Jun-2020 19:10:41
From the text, we can generate all suffixes to make a tree structure. We know that every pattern that presents in the text, must be a prefix of one of the possible suffix in the text. By building Trie of all suffixes, we can find any substring in linear time. Every suffix is ending with string terminating symbol. From each node if there is any path, it moves forward, otherwise returns that pattern is not found.For this algorithm, the time complexity is O(m+k), where the m is the length of string and k is the frequency of the pattern in ... Read More

## Suffix Array

Updated on 15-Jun-2020 19:15:53
From a given string, we can get all possible suffixes. After sorting the suffixes in lexicographical order, we can get the suffix array. Suffix arrays can also be formed using suffix trees. By using the DFS traversal of suffix trees, we can get suffix arrays. Suffix arrays are helpful to find suffixes in linear time. We can also find substrings using suffix array by using binary search type procedure.The time complexity is O(m log n)Input and OutputInput: Main String: “BANANA”, Pattern: “NAN” Output: Pattern found at position: 2AlgorithmfillSuffixArray (text, suffArray)Input: The main stringOutput: The array of suffixesBegin    n := text Length ... Read More

## Rabin-Karp Algorithm

Updated on 15-Jun-2020 19:24:52
Rabin-Karp is another pattern searching algorithm to find the pattern in a more efficient way. It also checks the pattern by moving window one by one, but without checking all characters for all cases, it finds the hash value. When the hash value is matched, then only it tries to check each character. This procedure makes the algorithm more efficient.The time complexity is O(m+n), but for the worst case, it is O(mn).Input and OutputInput: Main String: “ABAAABCDBBABCDDEBCABC”, Pattern “ABC” Output: Pattern found at position: 4 Pattern found at position: 10 Pattern found at position: 18AlgorithmrabinKarpSearch(text, pattern, prime)Input − The main ... Read More

## Naive Pattern Searching

Updated on 15-Jun-2020 18:34:58
Naïve pattern searching is the simplest method among other pattern searching algorithms. It checks for all character of the main string to the pattern. This algorithm is helpful for smaller texts. It does not need any pre-processing phases. We can find substring by checking once for the string. It also does not occupy extra space to perform the operation.The time complexity of Naïve Pattern Search method is O(m*n). The m is the size of pattern and n is the size of the main string.Input and OutputInput: Main String: “ABAAABCDBBABCDDEBCABC”, pattern: “ABC” Output: Pattern found at position: 4 Pattern found at ... Read More

## Manacher’s Algorithm

Updated on 15-Jun-2020 18:40:57
To find the longest palindromic substring from a string, we can use Manacher’s Algorithm. By selecting each character, we will try to find if there any palindrome using left and right pointer. There is another array to store information, from that information we can easily find how long the palindrome is. For each character, the array will store information. After traversing the whole string, we can find the longest palindromic subsequence from the created array.The time complexity of this algorithm is O(n).Input and OutputInput: String: “levelup” Output: Longest palindrome is: levelAlgorithmlongestPalindrome(text)Input − The text to find the longest palindromeOutput − ... Read More

## Knuth-Morris-Pratt Algorithm

Updated on 15-Jun-2020 18:49:35
Knuth Morris Pratt (KMP) is an algorithm, which checks the characters from left to right. When a pattern has a sub-pattern appears more than one in the sub-pattern, it uses that property to improve the time complexity, also for in the worst case.The time complexity of KMP is O(n).Input and OutputInput: Main String: “AAAABAAAAABBBAAAAB”, The pattern “AAAB” Output: Pattern found at location: 1 Pattern found at location: 7 Pattern found at location: 14AlgorithmfindPrefix(pattern, m, prefArray)Input − The pattern, the length of pattern and an array to store prefix locationOutput − The array to store where prefixes are locatedBegin    length ... Read More

## kasai’s Algorithm

Updated on 15-Jun-2020 19:00:01
Kasai’s Algorithm is used to get the Longest Common Prefix (LCP) array from suffix array. At first suffix arrays are found. After that Kasai's algorithm takes the suffix array list to find LCP.For the LCP array, it takes O(m log n), where m is pattern length and n is the length of the text. The Kasai’s Algorithm, it takes O(n) for searching the pattern in the main string.Input and OutputInput: Main String: “banana” Output: Suffix Array : 5 3 1 0 4 2 Common Prefix Array : 1 3 0 0 2 0AlgorithmbuildSuffixArray(text)Input: The main stringOutput: The suffix array, built ... Read More

## Efficient Construction of Finite Automata

Updated on 15-Jun-2020 17:31:15
By constructing Finite Automata, we can simply perform the pattern searching in texts. At first, we have to fill a 2D array to make the transition table of the finite automata. Once the table is created, the searching procedure is simple. By starting from the first state of the automaton, when we reach the final state, it means that the pattern is found in the string.For finite automata construction, the time complexity is O(M*K), M is the pattern length and the K is a number of different characters. The complexity of main pattern searching is O(n).Input and OutputInput: Main String: ... Read More