Naive algorithm for Pattern Searching

04 Jul, 2022
Given a text txt[0..n-1] and a pattern pat[0..m-1], write a function search(char pat[], char txt[]) that prints all occurrences of pat[] in txt[]. You may assume that n > m. Examples: 
Input:  txt[] = "THIS IS A TEST TEXT"
        pat[] = "TEST"
Output: Pattern found at index 10

Input:  txt[] =  "AABAACAADAABAABA"
        pat[] =  "AABA"
Output: Pattern found at index 0
        Pattern found at index 9
        Pattern found at index 12
 
Pattern searching is an important problem in computer science. When we do search for a string in notepad/word file or browser or database, pattern searching algorithms are used to show the search results.  
Naive Pattern Searching: Slide the pattern over text one by one and check for a match. If a match is found, then slides by 1 again to check for subsequent matches.  
C
C++
Java
Python3
C#
PHP
Javascript
// C program for Naive Pattern Searching algorithm#include <stdio.h>#include <string.h> void search(char* pat, char* txt){    int M = strlen(pat);    int N = strlen(txt);     /* A loop to slide pat[] one by one */    for (int i = 0; i <= N - M; i++) {        int j;         /* For current index i, check for pattern match */        for (j = 0; j < M; j++)            if (txt[i + j] != pat[j])                break;         if (j == M) // if pat[0...M-1] = txt[i, i+1, ...i+M-1]            printf("Pattern found at index %d \n", i);    }} /* Driver program to test above function */int main(){    char txt[] = "AABAACAADAABAAABAA";    char pat[] = "AABA";    search(pat, txt);    return 0;}
// C++ program for Naive Pattern// Searching algorithm#include <bits/stdc++.h>using namespace std; void search(char* pat, char* txt){    int M = strlen(pat);    int N = strlen(txt);     /* A loop to slide pat[] one by one */    for (int i = 0; i <= N - M; i++) {        int j;         /* For current index i, check for pattern match */        for (j = 0; j < M; j++)            if (txt[i + j] != pat[j])                break;         if (j == M) // if pat[0...M-1] = txt[i, i+1, ...i+M-1]            cout << "Pattern found at index "                 << i << endl;    }} // Driver Codeint main(){    char txt[] = "AABAACAADAABAAABAA";    char pat[] = "AABA";    search(pat, txt);    return 0;} // This code is contributed// by Akanksha Rai
// Java program for Naive Pattern Searching public class NaiveSearch {     static void search(String pat,String txt){        int l1=pat.length();        int l2=txt.length();        int i=0,j=l2-1;                 for(i=0,j=l2-1;j<l1;){                         if(txt.equals(pat.substring(i,j+1))){                System.out.println("Pattern found at index "+i);                            }                i++;                j++;        }    }                              public static void main(String args[]){        String pat="AABAACAADAABAAABAA";        String txt="AABA";                 search(pat,txt);    }}// This code is contributed by D. Vishnu Rahul Varma
# Python3 program for Naive Pattern# Searching algorithmdef search(pat, txt):    M = len(pat)    N = len(txt)     # A loop to slide pat[] one by one */    for i in range(N - M + 1):        j = 0                 # For current index i, check        # for pattern match */        while(j < M):            if (txt[i + j] != pat[j]):                break            j += 1         if (j == M):            print("Pattern found at index ", i) # Driver Codeif __name__ == '__main__':    txt = "AABAACAADAABAAABAA"    pat = "AABA"    search(pat, txt) # This code is contributed# by PrinciRaj1992
// C# program for Naive Pattern Searchingusing System; class GFG {     public static void search(String txt, String pat)    {        int M = pat.Length;        int N = txt.Length;         /* A loop to slide pat one by one */        for (int i = 0; i <= N - M; i++) {            int j;             /* For current index i, check for pattern            match */            for (j = 0; j < M; j++)                if (txt[i + j] != pat[j])                    break;             // if pat[0...M-1] = txt[i, i+1, ...i+M-1]            if (j == M)                Console.WriteLine("Pattern found at index " + i);        }    }     // Driver code    public static void Main()    {        String txt = "AABAACAADAABAAABAA";        String pat = "AABA";        search(txt, pat);    }}// This code is Contributed by Sam007
<?php// PHP program for Naive Pattern// Searching algorithm function search($pat, $txt){    $M = strlen($pat);    $N = strlen($txt);     // A loop to slide pat[]    // one by one    for ($i = 0; $i <= $N - $M; $i++)    {         // For current index i,        // check for pattern match        for ($j = 0; $j < $M; $j++)            if ($txt[$i + $j] != $pat[$j])                break;         // if pat[0...M-1] =        // txt[i, i+1, ...i+M-1]        if ($j == $M)            echo "Pattern found at index ", $i."\n";    }}     // Driver Code    $txt = "AABAACAADAABAAABAA";    $pat = "AABA";    search($pat, $txt);     // This code is contributed by Sam007?>
<script>    // Javascript program for Naive Pattern Searching         function search(txt, pat)    {        let M = pat.length;        let N = txt.length;           /* A loop to slide pat one by one */        for (let i = 0; i <= N - M; i++) {            let j;               /* For current index i, check for pattern            match */            for (j = 0; j < M; j++)                if (txt[i + j] != pat[j])                    break;               // if pat[0...M-1] = txt[i, i+1, ...i+M-1]            if (j == M)                document.write("Pattern found at index " + i + "</br>");        }    }         let txt = "AABAACAADAABAAABAA";    let pat = "AABA";    search(txt, pat);                                </script>
Output: 
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
Pattern found at index 0 
Pattern found at index 9 
Pattern found at index 13 
What is the best case? The best case occurs when the first character of the pattern is not present in text at all.
C
txt[] = "AABCCAADDEE";pat[] = "FAA";
The number of comparisons in best case is O(n). What is the worst case ? The worst case of Naive Pattern Searching occurs in following scenarios. 1) When all characters of the text and pattern are same.  
C
txt[] = "AAAAAAAAAAAAAAAAAA";pat[] = "AAAAA";
2) Worst case also occurs when only the last character is different.  
C
txt[] = "AAAAAAAAAAAAAAAAAB";pat[] = "AAAAB";
The number of comparisons in the worst case is O(m*(n-m+1)). Although strings which have repeated characters are not likely to appear in English text, they may well occur in other applications (for example, in binary texts). The KMP matching algorithm improves the worst case to O(n). We will be covering KMP in the next post. Also, we will be writing more posts to cover all pattern searching algorithms and data structures.  
Naive Algorithm for Pattern Searching | GeeksforGeeks - YouTubeGeeksforGeeks530K subscribersNaive Algorithm for Pattern Searching | GeeksforGeeksWatch laterShareCopy link97/101InfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.More videosMore videosYou're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 5:29•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=nK7SLhXcqRo" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
Alternate Approach using 2 pointers – 
In this approach we take 2 pointers i and j similar to as discussed in the above approach. In this approach instead of checking for each index again and again we move ahead as we check for our pattern string. Basically the idea behind is that once a pattern is broken there is no point to search for the pattern in the indexes that j traversed through. I know it is hard to understand but try to dry run the code and it will make sense! Code has comments to better explain each step.
This algorithm will be much better in case the pattern string is very large and there are incomplete occurrences of patterns in the main string.
eg. 
string text = “AAAAAAABBBBBBBBBBBCCCDDAAAAAAABBBBBBBBBBBCCCDDD”
string pat = “AAAAAAABBBBBBBBBBBCCCDDD”
Now here in the text at index 0, the pattern would have been found if there were 3 D’s instead of 2,  now incase we were using the approach as discussed above, we would have to again check for all indexes between 0 and index of ‘D’ but we very well know that the pattern cannot exist between these two indexes. (think about it) 
Try to dry run the code and it will make more sense!
C++
// C++ code to find patterns in a string #include <iostream>using namespace std; // function that return index from where pattern beginsint search(string pat, string txt){    // Your code here    int j = 0;    int m = pat.length();         // notice how 'i' moves ahead with 'j' and we don't have to check for each index 'i'    for (int i = 0; i < txt.length(); i++)    {        if (txt[i] == pat[j]) // trying to look for pattern            j++;        else        {            if (j > 0){ //this is very important, since incase there is no matching we will keep reducing i and get stuck in an infinite loop                i--; //we do this because for loop will increment 'i', but we want to keep searching for the                      //pattern from the index where the pattern was broken            }            j = 0; //resetting pattern        }         if (j == m) // if this is true then that means pattern is found!            return i - pat.length() + 1;//since i has moved ahead with pattern    }       return -1; // no matching found} int main(){    string txt = "AABAACAADAABAAABAA";    string pat =  "AABA";      cout << "Pattern found at index : "<< search(pat,txt);    return 0;} // code contributed by Anshit Bansal
Time Complexity – O(n)
Space Complexity – O(1)
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
Sam007
Brij Raj Kishore
jahid_nadim
princiraj1992
Akanksha_Rai
Vikku_Sharma
decode2207
shashwawtforwork
dvrv369
anshitbansal
paritoshdev26
MAQ Software
Oracle
Payu
Qualcomm
Pattern Searching
Strings
Oracle
Payu
MAQ Software
Qualcomm
Strings
Pattern Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.