几种常见的字符串匹配算法原理以及代码实现
字符串匹配算法是指用于比较两个字符串是否相等的算法。以下是几种常见的字符串匹配算法及其原理和实现代码:
1. Boyer-Moore 算法
Boyer-Moore 算法是一种高效的字符串匹配算法,它使用分治算法的思想,将字符串分成多个子串,然后逐个比较子串是否匹配。该算法的时间复杂度为 O(nlogn),其中 n 为字符串的长度。
实现代码:
```c
#include <stdio.h>
#include <string.h>
void BoyerMooreSearch(char* s1, char* s2) {
int m = strlen(s1);
int n = strlen(s2);
int k = -1;
char ch;
while (k < n) {
while (k < n && s2[k] != ch) {
k++;
}
if (k == n) {
break;
}
while (k < n && s1[k] != ch) {
k++;
}
if (k == n) {
continue;
}
printf("找到了匹配\n");
break;
}
}
int main() {
char s1[] = "我国的计算机科学与技术";
char s2[] = "计算机科学与技术";
BoyerMooreSearch(s1, s2);
return 0;
}
```
2.BM 算法的改进版本
BM 算法的改进版本称为 BM- Moore 算法,它使用更长的子串来查找匹配,从而提高了查找效率。它的实现原理与 Boyer-Moore 算法类似,也是将字符串分成多个子串,然后逐个比较子串是否匹配。
实现代码:
```c
#include <stdio.h>
#include <string.h>
void BMSearch(char* s1, char* s2) {
int m = strlen(s1);
int n = strlen(s2);
int k = -1;
char ch;
while (k < n) {
while (k < n && s2[k] != ch) {
k++;
}
if (k == n) {
break;
}
while (k < n && s1[k] != ch) {
k++;
}
if (k == n) {
continue;
}
printf("找到了匹配\n");
break;
}
}
int main() {
char s1[] = "我国的计算机科学与技术";
char s2[] = "计算机科学与技术";
BMSearch(s1, s2);
return 0;
}
```
3.哈希匹配算法
哈希匹配算法是一种简单的字符串匹配算法,它使用哈希函数将字符串映射到某个整数值,然后将该整数作为索引来查找字符串表中是否存在匹配的子串。哈希匹配算法的时间复杂度为 O(n),其中 n 为字符串的长度。
实现代码:
```c
#include <stdio.h>
#include <string.h>
void HashSearch(char* s1, char* s2) {
int m = strlen(s1);
int n = strlen(s2);
int k = -1;
char ch;
while (k < n) {
while (k < n && s2[k] != ch) {
k++;
}
if (k == n) {
break;
}
while (k < n && s1[k] != ch) {
k++;
}
if (k == n) {
continue;
}
printf("找到了匹配\n");
break;
}
}
int main() {
char s1[] = "我国的计算机科学与技术";
char s2[] = "计算机科学与技术";
HashSearch(s1, s2);
return 0;
}
```
4. KMP 算法
KMP 算法是一种字符串匹配算法,它使用了一种类似于哈希匹配算法的思想,但相比于哈希匹配算法,KMP 算法具有更好的性能。KMP 算法的时间复杂度为 O(m+n),其中 m 和 n 分别是两个字符串的长度。
实现代码:
```c
#include <stdio.h>
#include <string.h>
void kmp_search(char* s1, char* s2) {
int m = strlen(s1);
int n = strlen(s2);
char* p1 = s1;
char* p2 = s2;
int i = 0, j = 0;
while (i < m && j < n) {
if (p1[i] == p2[j]) {
i++;
j++;
} else {
if (i == m) {
printf("没有匹配\n");
} else {
j++;
}
}
}
if (i < m) {
printf("没有匹配\n");
} else {
printf("匹配在 %d 和 %d 处\n", i, j);
}
}
int main() {
char s1[] = "我国的计算机科学与技术";
char s2[] = "计算机科学与技术";
kmp_search(s1, s2);
return 0;
}
```
以上是几种常见的字符串匹配算法及其实现代码。这些算法在不同的场景下具有不同的性能,需要根据实际情况进行选择。