给定一个字符数组txt[0..n-1] 和一个模式pat [0..m-1],写一个搜索函数search(char pat [],char txt []),该函数在txt中打印所有出现的pat [] []。你可以假设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
模式搜索是在计算机科学领域的一个重要问题,当我们在notepad/word 文件中或者浏览器,数据库中进行搜索一个字符串时,模式搜索算法就被用来显示搜到的结果。
算法思想:
逐个将文字对比文本并检查匹配。如果找到匹配,则再依次递增1以检查随后的匹配。
下面是代码实现:
// 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);
int i;
/* A loop to slide pat[] one by one */
for (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;
}
输出:
Pattern found at index 0 Pattern found at index 9 Pattern found at index 13
算法分析:
1、什么是最好的情况?
最好的情况发生在模式的第一个字符根本不存在于文本中。
txt[] = "AABCCAADDEE" pat[] = "FAA"
在最好的情况下比较的数量是O(n)
2、什么是最坏的情况?
模式搜索的最坏情况发生在以下情况。
1)当文本和图案的所有字符相同时。
txt[] = "AAAAAAAAAAAAAAAAAA" pat[] = "AAAAA".
2)只有最后一个字符不同时也会发生最坏的情况。
txt[] = "AAAAAAAAAAAAAAAAAB" pat[] = "AAAAB"
最坏情况下的比较数是O(m *(n-m + 1))。尽管重复字符的字符串不可能出现在英文文本中,但是在其他应用程序(例如,二进制文本)中可能会出现该字符串。KMP匹配算法将最差情况改善为O(n)。我们将在下一篇文章中介绍KMP。此外,我们将写更多的帖子来涵盖所有的模式搜索算法和数据结构。
如果你有什么问题,那就给我留言吧。