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 program for Naive Pattern Searching algorithm
#include <stdio.h>
#include <string.h>
voidsearch(char* pat, char* txt)
{
intM = strlen(pat);
intN = strlen(txt);
/* A loop to slide pat[] one by one */
for(inti = 0; i <= N - M; i++) {
intj;
/* 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 */
intmain()
{
chartxt[] = "AABAACAADAABAAABAA";
charpat[] = "AABA";
search(pat, txt);
return0;
}
C++
// C++ program for Naive Pattern
// Searching algorithm
#include <bits/stdc++.h>
usingnamespacestd;
voidsearch(char* pat, char* txt)
{
intM = strlen(pat);
intN = strlen(txt);
/* A loop to slide pat[] one by one */
for(inti = 0; i <= N - M; i++) {
intj;
/* 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 Code
intmain()
{
chartxt[] = "AABAACAADAABAAABAA";
charpat[] = "AABA";
search(pat, txt);
return0;
}
// This code is contributed
// by Akanksha Rai
Java
// Java program for Naive Pattern Searching
publicclassNaiveSearch {
publicstaticvoidsearch(String txt, String pat)
{
intM = pat.length();
intN = txt.length();
/* A loop to slide pat one by one */
for(inti = 0; i <= N - M; i++) {
intj;
/* 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);
}
}
publicstaticvoidmain(String[] args)
{
String txt = "AABAACAADAABAAABAA";
String pat = "AABA";
search(txt, pat);
}
}
// This code is contributed by Harikishore
Python3
# Python3 program for Naive Pattern
# Searching algorithm
defsearch(pat, txt):
M =len(pat)
N =len(txt)
# A loop to slide pat[] one by one */
fori inrange(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 Code
if__name__ =='__main__':
txt ="AABAACAADAABAAABAA"
pat ="AABA"
search(pat, txt)
# This code is contributed
# by PrinciRaj1992
C#
// C# program for Naive Pattern Searching
usingSystem;
classGFG {
publicstaticvoidsearch(String txt, String pat)
{
intM = pat.Length;
intN = txt.Length;
/* A loop to slide pat one by one */
for(inti = 0; i <= N - M; i++) {
intj;
/* 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
publicstaticvoidMain()
{
String txt = "AABAACAADAABAAABAA";
String pat = "AABA";
search(txt, pat);
}
}
// This code is Contributed by Sam007
PHP
<?php
// PHP program for Naive Pattern
// Searching algorithm
functionsearch($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
?>
Javascript
<script>
// Javascript program for Naive Pattern Searching
functionsearch(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:
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.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy