国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(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)的評論 (共 條)

分享到微博請遵守國家法律
沽源县| 饶河县| 中西区| 旬邑县| 大连市| 依安县| 嵊州市| 宿迁市| 海林市| 仁怀市| 文山县| 察隅县| 梓潼县| 祁阳县| 章丘市| 桦南县| 潮州市| 金华市| 揭阳市| 无为县| 鄂托克前旗| 行唐县| 七台河市| 汨罗市| 三门县| 鹿泉市| 云龙县| 鄄城县| 沙河市| 宾阳县| 牡丹江市| 安陆市| 昌平区| 大悟县| 呼和浩特市| 万全县| 土默特左旗| 东海县| 宁波市| 桂阳县| 隆回县|