给定文本txt [0..n-1]和模式pat [0..m-1] ,编写一个函数search(char pat [],char txt []) ,将所有出现的pat []都打印在txt中[] 。您可以假设n> m 。
例子:
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
模式搜索是计算机科学中的一个重要问题。当我们在记事本/单词文件或浏览器或数据库中搜索字符串时,将使用模式搜索算法来显示搜索结果。
天真的模式搜索:
一张一张地在文本上滑动图案,然后检查是否匹配。如果找到匹配项,则再次滑动1以检查后续匹配项。
C
// C program for Naive Pattern Searching algorithm
#include
#include
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
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
Javascript
C
txt[] = "AABCCAADDEE";
pat[] = "FAA";
C
txt[] = "AAAAAAAAAAAAAAAAAA";
pat[] = "AAAAA";
C
txt[] = "AAAAAAAAAAAAAAAAAB";
pat[] = "AAAAB";
输出:
Pattern found at index 0
Pattern found at index 9
Pattern found at index 13
最好的情况是什么?
最好的情况是当模式的第一个字符根本不在文本中出现时。
C
txt[] = "AABCCAADDEE";
pat[] = "FAA";
在最佳情况下,比较次数为O(n)。
最坏的情况是什么?
朴素模式搜索的最坏情况发生在以下情况下。
1)当文字和图案的所有字符都相同时。
C
txt[] = "AAAAAAAAAAAAAAAAAA";
pat[] = "AAAAA";
2)当仅最后一个字符不同时,也会发生最坏情况。
C
txt[] = "AAAAAAAAAAAAAAAAAB";
pat[] = "AAAAB";
最坏情况下的比较次数为O(m *(n-m + 1))。尽管具有重复字符的字符串不太可能出现在英文文本中,但是它们很可能出现在其他应用程序中(例如,在二进制文本中)。 KMP匹配算法将最坏情况改善为O(n)。我们将在下一篇文章中介绍KMP。另外,我们将写更多的文章来介绍所有模式搜索算法和数据结构。