日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典算法——KMP模式匹配

發布時間:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典算法——KMP模式匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?對于一個串中某個子串的定位操作稱為串的模式匹配,其中待定的子串稱為模式串。算法的基本思想:從主串的第一個位置起和模式串的第一個字符開始比較,如果想等,則繼續逐一比較后續字符;否則從主串的第二個字符開始,在重新用上一步的方法與模式串中的字符比較,以此類推,知道比較完模式串的所有字符。若匹配成功,則返回模式串在主串中的位置;若匹配不成功,則返回一個可區別與主串所有位置的標記,如“-1”,這是最簡單的模式匹配,暴力枚舉。

? ? ? ?上面是一個簡單的模式匹配,優點是容易理解,實現簡單;缺點也很明顯:效率不高。

? ? ? ?從簡單模式匹配算法可以看兩點重要信息:1.標記i在主串中的位置基本反映了算法完成的進度,i走的越快,或者說i回溯的距離越小,算法執行就越快。2.通過i和j的回溯,是的下一趟盡可能消除當前位置的不匹配,進而使i繼續往前走。由此,容易看出提升效率的一個可能的突破點:不回溯i,想辦法通過調整j的位置消除i的不匹配。

? ? ? 定義一個整型數組next[],next[n]中保存了模式串下標n處發生不匹配時,主串應當從模式串下標k處的字符開始比較,即next[n] = k;

? ? ? 由于最近比較忙,對于具體算法推導就先不寫了,有空會補齊,整個推導的過程。

? ? ?下面是KMP的一個簡單實現,雖然求解next數組的方法不是一種高效的方法,但卻更便于手工推導。

#include <stdio.h> #include <string.h>int KMP(char str[], char subStr[], int next[]) {int i = 0, j = 0;while(i < strlen(str) && j < strlen(subStr)){if(str[i] == subStr[j]){++i;++j;}else{j = next[j];if(j == -1){j = 0;++i;}}}if(j == strlen(subStr))return i - strlen(subStr);elsereturn -1; }void getNext(char subStr[], int next[]) {int i = 0, j = -1;next[0] = j;while(i < strlen(subStr)){if(j == -1 || subStr[i] == subStr[j]){++i;++j;next[i] = j;}elsej = next[j];} }int main() {char str[100], subStr[50];int next[50] = {0};scanf("%s", str); ///主串 scanf("%s", subStr); ///模式串 getNext(subStr, next);for(int i=0; i < strlen(subStr); i++) ///輸出next數組的值 {printf("%d ", next[i]);}printf("\n");int pos = KMP(str, subStr, next);printf("%d\n", pos);return 0; }


總結

以上是生活随笔為你收集整理的经典算法——KMP模式匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。