两种方法实现字符串匹配算法
1.主要内容
字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括暴力搜索(Brute force),KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap。下面分析这几种方法并给出其实现。假设原字符串长度M,字串长度为N。
2.题目要求
1.第一种将字符串存到数组,然后遍历数组下标实现。
2.第二种遍历指针实现。
该方法又称暴力搜索,也是最容易想到的方法。预处理时间 O(0),匹配时间复杂度O(N*M)
3.代码实现
(1)将字符串存到数组,然后遍历数组下标实现。
void bfmatch(char *a,char *b)
{int M = strlen(a);int N= strlen(b);for (int i = 0; i <= M - N; i++){int j;for ( j = 0; j < N; j++){if (a[i + j] != b[j])break;}if (j == N){printf("数组遍历:您好,第一次出现的位置是%d\n", i);break;}}}
(2)遍历指针实现
void bf(char *a, char *b)
{if (*a == '\0' || *b == '\0'){printf("错误");return;}int M = strlen(a);int N = strlen(b);char *s = a;char *p = s;char *q = b;while (*p!='\0'){if (*p == *q){p++;q++;if (*q == '\0'){printf("\n%d\n", (b - q)-(a-p));break;}}else{s++;p = s;q = b;}}
}