字串匹配: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;}