五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

幾種常見的字符串匹配算法原理以及代碼實現(xiàn)

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


字符串匹配算法是指用于比較兩個字符串是否相等的算法。以下是幾種常見的字符串匹配算法及其原理和實現(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)行選擇。


幾種常見的字符串匹配算法原理以及代碼實現(xiàn)的評論 (共 條)

分享到微博請遵守國家法律
绍兴市| 昌江| 屯留县| 霍州市| 博乐市| 松原市| 莆田市| 玉屏| 乌鲁木齐市| 故城县| 天等县| 邵武市| 定边县| 沾化县| 栾川县| 都昌县| 开远市| 玛曲县| 砚山县| 龙川县| 唐河县| 玉环县| 剑阁县| 宣恩县| 大庆市| 南丰县| 普宁市| 康平县| 太白县| 武穴市| 土默特左旗| 洛川县| 马龙县| 湛江市| 齐齐哈尔市| 康定县| 东平县| 黎城县| 牡丹江市| 通辽市| 丹江口市|