Optimized Algorithm for Pattern Searching - GeeksforGeeks

13 Apr, 2022
Question: We have discussed Naive String matching algorithm here. Consider a situation where all characters of pattern are different. Can we modify the original Naive String Matching algorithm so that it works better for these types of patterns. If we can, then what are the changes to original algorithm?
Solution: In the original Naive String matching algorithm , we always slide the pattern by 1. When all characters of pattern are different, we can slide the pattern by more than 1. Let us see how can we do this. When a mismatch occurs after j matches, we know that the first character of pattern will not match the j matched characters because all characters of pattern are different. So we can always slide the pattern by j without missing any valid shifts. Following is the modified code that is optimized for the special patterns. 
N.B :  This algorithm only works when the search pattern pat has all different characters.
C++
C
Java
Python3
C#
PHP
Javascript
/* C++ program for A modified Naive Pattern Searching algorithm that is optimized for the cases when all characters of pattern are different */#include <bits/stdc++.h>using namespace std;  /* A modified Naive Pattern Searchingalgorithm that is optimized for thecases when all characters of pattern are different */void search(string pat, string txt){    int M = pat.size();    int N = txt.size();    int i = 0;      while (i <= N - M) {        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;            i = i + M;        }        else if (j == 0)            i = i + 1;        else            i = i + j; // slide the pattern by j    }}  /* Driver code*/int main(){    string txt = "ABCEABCDABCEABCD";    string pat = "ABCD";    search(pat, txt);    return 0;}  // This code is contributed by rathbhupendra
/* C program for A modified Naive Pattern Searching  algorithm that is optimized for the cases when all  characters of pattern are different */#include <stdio.h>#include <string.h>  /* A modified Naive Pattern Searching algorithm that is optimized   for the cases when all characters of pattern are different */void search(char pat[], char txt[]){    int M = strlen(pat);    int N = strlen(txt);    int i = 0;      while (i <= N - M) {        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);            i = i + M;        }        else if (j == 0)            i = i + 1;        else            i = i + j; // slide the pattern by j    }}  /* Driver program to test above function */int main(){    char txt[] = "ABCEABCDABCEABCD";    char pat[] = "ABCD";    search(pat, txt);    return 0;}
/* Java program for A modified Naive Pattern Searching algorithm that is optimized for the cases when all characters of pattern are different */  class GFG {      /* A modified Naive Pattern Searchingalgorithm that is optimized for thecases when all characters of pattern are different */    static void search(String pat, String txt)    {        int M = pat.length();        int N = txt.length();        int i = 0;          while (i <= N - M) {            int j;              /* For current index i, check for pattern match */            for (j = 0; j < M; j++)                if (txt.charAt(i + j) != pat.charAt(j))                    break;              if (j == M) // if pat[0...M-1] = txt[i, i+1, ...i+M-1]            {                System.out.println("Pattern found at index " + i);                i = i + M;            }            else if (j == 0)                i = i + 1;            else                i = i + j; // slide the pattern by j        }    }      /* Driver code*/    public static void main(String[] args)    {        String txt = "ABCEABCDABCEABCD";        String pat = "ABCD";        search(pat, txt);    }}  // This code is contributed by chandan_jnu
# Python program for A modified Naive Pattern Searching# algorithm that is optimized for the cases when all# characters of pattern are differentdef search(pat, txt):    M = len(pat)    N = len(txt)    i = 0      while i <= N-M:        # For current index i, check for pattern match        for j in range(M):            if txt[i + j] != pat[j]:                break            j += 1          if j == M:    # if pat[0...M-1] = txt[i, i + 1, ...i + M-1]            print ("Pattern found at index " + str(i))            i = i + M        elif j == 0:            i = i + 1        else:            i = i + j    # slide the pattern by j  # Driver program to test the above functiontxt = "ABCEABCDABCEABCD"pat = "ABCD"search(pat, txt)  # This code is contributed by Bhavya Jain
/* C# program for A modified Naive Pattern Searching algorithm that is optimized for the cases when all characters of pattern are different */  using System;  class GFG {      /* A modified Naive Pattern Searchingalgorithm that is optimized for thecases when all characters of pattern are different */    static void search(string pat, string txt)    {        int M = pat.Length;        int N = txt.Length;        int i = 0;          while (i <= N - M) {            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]            {                Console.WriteLine("Pattern found at index " + i);                i = i + M;            }            else if (j == 0)                i = i + 1;            else                i = i + j; // slide the pattern by j        }    }      /* Driver code*/    static void Main()    {        string txt = "ABCEABCDABCEABCD";        string pat = "ABCD";        search(pat, txt);    }}  // This code is contributed by chandan_jnu
<?php// PHP program for A modified Naive // Pattern Searching algorithm that// is optimized for the cases when all// characters of pattern are different   /* A modified Naive Pattern Searching   algorithm that is optimized for the   cases when all characters of    pattern are different */function search($pat, $txt){    $M = strlen($pat);    $N = strlen($txt);    $i = 0;      while ($i <= $N - $M)    {        $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)         {            echo("Pattern found at index $i"."\n" );            $i = $i + $M;        }        else if ($j == 0)            $i = $i + 1;        else                      // slide the pattern by j            $i = $i + $j;     }}  // Driver Code$txt = "ABCEABCDABCEABCD";$pat = "ABCD";search($pat, $txt);  // This code is contributed by nitin mittal.?>
<script>  // Javascript program for A modified// Naive Pattern Searching algorithm// that is optimized for the cases // when all characters of pattern // are different  // A modified Naive Pattern Searching// algorithm that is optimized for the// cases when all characters of pattern // are different function search(pat, txt) {     let M = pat.length;     let N = txt.length;     let i = 0;       while (i <= N - M)     {         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/>");             i = i + M;         }         else if (j == 0)             i = i + 1;         else                      // Slide the pattern by j             i = i + j;     } }       // Driver codelet txt = "ABCEABCDABCEABCD"; let pat = "ABCD";   search(pat, txt);  // This code is contributed by target_2  </script>
Output: 
Pattern found at index 4
Pattern found at index 12
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
rathbhupendra
Chandan_Kumar
target_2
sweetyty
simmytarika5
kk773572498
amartyaghoshgfg
thenitu
Pattern Searching
Pattern Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Check if a string is substring of another
Minimize number of cuts required to break N length stick into N unit length sticks
Wildcard Pattern Matching
Check if an URL is valid or not using Regular Expression
Check if a string contains uppercase, lowercase, special characters and numeric values
How to check if string contains only digits in Java
Search a Word in a 2D Grid of characters
String matching where one string contains wildcard characters
Frequency of a substring in a string
Pattern Searching using Suffix Tree