最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

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

分享到微博請遵守國家法律
康保县| 凤山市| 临夏县| 当阳市| 苏尼特右旗| 石阡县| 沁水县| 博白县| 远安县| 南涧| 比如县| 龙里县| 疏附县| 红河县| 连州市| 建瓯市| 乾安县| 得荣县| 临汾市| 岳西县| 舟山市| 衡阳县| 定南县| 苏尼特左旗| 韶关市| 社旗县| 光泽县| 宁南县| 浪卡子县| 织金县| 万盛区| 鞍山市| 长海县| 绥化市| 林州市| 南陵县| 丹巴县| 项城市| 陕西省| 申扎县| 元朗区|