Schreiben Sie bei einem gegebenen Text txt[0..n-1] und einem Muster pat[0..m-1] eine Funktion search(char pat[], char txt[]) , die alle Vorkommen von pat[] in txt ausgibt [] . Sie können davon ausgehen, dass n > m
Beispiele: 

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

 

Die Mustersuche ist ein wichtiges Problem in der Informatik. Wenn wir nach einer Zeichenfolge in Notepad/Word-Datei oder Browser oder Datenbank suchen, werden Mustersuchalgorithmen verwendet, um die Suchergebnisse anzuzeigen. 
 

Naive Mustersuche: 
Schieben Sie die Muster einzeln über den Text und suchen Sie nach Übereinstimmungen. Wenn eine Übereinstimmung gefunden wird, wird der Wert erneut um 1 verschoben, um nach weiteren Übereinstimmungen zu suchen. 
 

C

// 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++

// 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 Code
int main()
{
    char txt[] = "AABAACAADAABAAABAA";
    char pat[] = "AABA";
    search(pat, txt);
    return 0;
}
 
// This code is contributed
// by Akanksha Rai

Java

// Java program for Naive Pattern Searching
public class NaiveSearch {
 
    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.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);
        }
    }
 
    public static void main(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
def 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 Code
if __name__ == '__main__':
    txt = "AABAACAADAABAAABAA"
    pat = "AABA"
    search(pat, txt)
 
# This code is contributed
# by PrinciRaj1992

C#

// C# program for Naive Pattern Searching
using 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
// 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
?>

Javascript

<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>

Ausgabe: 

Pattern found at index 0 
Pattern found at index 9 
Pattern found at index 13 

Was ist der beste Fall?  
Der beste Fall tritt auf, wenn das erste Zeichen des Musters überhaupt nicht im Text vorhanden ist.

C

txt[] = "AABCCAADDEE";
pat[] = "FAA";

Die Anzahl der Vergleiche ist im besten Fall O(n). 
Was ist der schlimmste Fall?  
Der schlimmste Fall der naiven Mustersuche tritt in den folgenden Szenarien auf. 
1) Wenn alle Zeichen des Textes und Musters gleich sind. 
 

C

txt[] = "AAAAAAAAAAAAAAAAAA";
pat[] = "AAAAA";

2) Der schlimmste Fall tritt auch auf, wenn nur das letzte Zeichen anders ist. 
 

C

txt[] = "AAAAAAAAAAAAAAAAAB";
pat[] = "AAAAB";

Die Anzahl der Vergleiche beträgt im ungünstigsten Fall O(m*(n-m+1)). Obwohl Zeichenfolgen mit wiederholten Zeichen wahrscheinlich nicht in englischem Text erscheinen, können sie durchaus in anderen Anwendungen vorkommen (z. B. in binären Texten). Der KMP-Matching-Algorithmus verbessert den schlimmsten Fall auf O(n). Wir werden KMP im nächsten Beitrag behandeln. Außerdem werden wir weitere Beiträge schreiben, um alle Mustersuchalgorithmen und Datenstrukturen abzudecken. 
 

Falls Sie an Live-Kursen mit Experten teilnehmen möchten , beziehen Sie sich bitte auf DSA Live-Kurse für Berufstätige und Competitive Programming Live for Students .