幾種常見的字符串匹配算法原理以及代碼實現(xiàn)
字符串匹配算法是指用于比較兩個字符串是否相等的算法。以下是幾種常見的字符串匹配算法及其原理和實現(xiàn)代碼:
1. Boyer-Moore 算法
Boyer-Moore 算法是一種高效的字符串匹配算法,它使用分治算法的思想,將字符串分成多個子串,然后逐個比較子串是否匹配。該算法的時間復(fù)雜度為 O(nlogn),其中 n 為字符串的長度。
實現(xià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[] = "我國的計算機科學(xué)與技術(shù)";??
? ?char s2[] = "計算機科學(xué)與技術(shù)";??
? ? BoyerMooreSearch(s1, s2);??
? ?return 0;??
}
```
2.BM 算法的改進(jìn)版本
BM 算法的改進(jìn)版本稱為 BM- Moore 算法,它使用更長的子串來查找匹配,從而提高了查找效率。它的實現(xiàn)原理與 Boyer-Moore 算法類似,也是將字符串分成多個子串,然后逐個比較子串是否匹配。
實現(xiàn)代碼:
```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[] = "我國的計算機科學(xué)與技術(shù)";??
? ?char s2[] = "計算機科學(xué)與技術(shù)";??
? ?BMSearch(s1, s2);??
? ?return 0;??
}
```
3.哈希匹配算法
哈希匹配算法是一種簡單的字符串匹配算法,它使用哈希函數(shù)將字符串映射到某個整數(shù)值,然后將該整數(shù)作為索引來查找字符串表中是否存在匹配的子串。哈希匹配算法的時間復(fù)雜度為 O(n),其中 n 為字符串的長度。
實現(xià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[] = "我國的計算機科學(xué)與技術(shù)";??
? ?char s2[] = "計算機科學(xué)與技術(shù)";??
? ?HashSearch(s1, s2);??
? ?return 0;??
}
```
4. KMP 算法
KMP 算法是一種字符串匹配算法,它使用了一種類似于哈希匹配算法的思想,但相比于哈希匹配算法,KMP 算法具有更好的性能。KMP 算法的時間復(fù)雜度為 O(m+n),其中 m 和 n 分別是兩個字符串的長度。
實現(xià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[] = "我國的計算機科學(xué)與技術(shù)";??
? ?char s2[] = "計算機科學(xué)與技術(shù)";??
? ?kmp_search(s1, s2);??
? ?return 0;??
}
```
以上是幾種常見的字符串匹配算法及其實現(xiàn)代碼。這些算法在不同的場景下具有不同的性能,需要根據(jù)實際情況進(jìn)行選擇。