字串匹配:BF、KMP演算法

來源:互聯網
上載者:User

字串匹配:BF、KMP演算法

字串匹配演算法:BF、KMP演算法代碼。

 

/*****************************************  Copyright (c) 2015 Jingshuang Hu    @filename:demo.c  @datetime:2015.10.11  @author:HJS  @e-mail:[email protected]  @blog:http://blog.csdn.net/hujingshuang  *****************************************/#include #include #include #include using namespace std;/**************************************************/int text_read(char *S);void BF_String_Matching(char *S, char *T);void KMP_String_Matching(char *S, char *T);int *Partial_Matching_Table(char *T);/**************************************************/int main(){char *S = (char *)malloc(1000 * sizeof(char));char T[100];text_read(S);printf(給定文本串:%s, S);printf(輸入模式串:);gets(T);printf(-------BF演算法-------);BF_String_Matching(S, T);printf(-------KMP演算法------);KMP_String_Matching(S, T);printf();return 0;}/**************************************************/int text_read(char *S){int len = 0;char ch;FILE *fp = fopen(test.txt,r);if (!fp){printf(開啟檔案失敗!);return 1;}while((ch = getc(fp)) != EOF){S[len] = ch;len++;}fclose(fp);S[len] = '';S = (char *)realloc(S, (len + 1) * sizeof(char));return 0;}/**************************************************///暴力法void BF_String_Matching(char *S, char *T){int S_length = strlen(S);int T_length = strlen(T);int i = 0, j = 0, same_length = 0;for (i = 0; i < S_length - T_length; i++){for (j = 0; j < T_length; j++){if (S[i + j] == T[j]){same_length++;}else{break;}}if (same_length == T_length){printf(在位置%d發現匹配!, i + 1);}same_length = 0;}}/**************************************************///KMP   移動位元 = 已匹配的字元數 - 對應的部分匹配值void KMP_String_Matching(char *S, char *T){int *table = Partial_Matching_Table(T);//擷取部分匹配表int S_length = strlen(S);int T_length = strlen(T);int i = 0, j = 0;int same_length = 0, move_pos = 0;for (i = 0; i < S_length - T_length; i++){if (S[i + 0] != T[0])//第一個字元都不等,則後移一位{continue;}else//否則,繼續對比後面字元{same_length++;for (j = 1; j < T_length; j++){if (S[i + j] == T[j]){same_length++;//已匹配數}else{move_pos = table[j - 1];break;}}}if (same_length == T_length){printf(在位置%d發現匹配!, i + 1);i += T_length - 1;//直接往後移動T_length位}else{i += same_length - move_pos - 1;//移動後i的位置}same_length = 0;}}/**************************************************///部分匹配表int *Partial_Matching_Table(char *T){int T_length = strlen(T);int *table = (int *)malloc(T_length * sizeof(int));int k = -1, i = 0, j = 0;memset(table, 0, T_length);//全部初始化成0table[0] = -1;while(j < T_length){if ((-1 == k) || (T[k] == T[j])){j++;k++;table[j] = k;}else{k = table[k];}}for (i = 0; i < T_length; i++){table[i] = table[i + 1];}table = (int *)realloc(table, T_length * sizeof(int));return table;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.