欢迎光临散文网 会员登陆 & 注册

几种常见的字符串匹配算法原理以及代码实现

2023-06-15 17:22 作者:自由的莱纳  | 我要投稿


字符串匹配算法是指用于比较两个字符串是否相等的算法。以下是几种常见的字符串匹配算法及其原理和实现代码:

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;  

}

```

以上是几种常见的字符串匹配算法及其实现代码。这些算法在不同的场景下具有不同的性能,需要根据实际情况进行选择。


几种常见的字符串匹配算法原理以及代码实现的评论 (共 条)

分享到微博请遵守国家法律