字符串匹配

来源:互联网 发布:js获取style 编辑:程序博客网 时间:2024/05/21 23:00

全部内容来自《算法导论》

//======================================================// 朴素字符串匹配算法 20140914//======================================================#include <stdio.h>#include <stdlib.h>#include <string.h>//======================================================// 运行时间为O((n-m-1)m)//======================================================void NativeStringMatcher(char *strText, char *strPattern){int n = strlen(strText);int m = strlen(strPattern);for (int s = 0; s < n - m + 1; s++) {int i = 0;while (i < m && strPattern[i] == strText[s + i])i++;if (i == m)printf("Pattern occors with shift %d\n", s);}}int main(){//char *strText = "bacbababacaababababacaaabcababacabab";//char *strPattern = "ababaca";char *strText = "aabbaabababaabbaabbaababaa";char *strPattern = "aa";NativeStringMatcher(strText, strPattern);system("pause");return 0;}


The Rabin-karp algorithm

//======================================================// Babin-Karp字符串匹配算法 20140914//======================================================#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>bool IsEqual(char *strDes, char *strSrc, int n){int i = 0;while (i < n) {if (strDes[i] != strSrc[i++])return false;}return true;}// d : radix   q : prime//=================================================================// Babin-Karp算法实现,注意数组下标从0开始//=================================================================void BabinKarpMatcher(char *strText, char *strPattern, int d, int q){int n = strlen(strText);int m = strlen(strPattern);int h = (int)pow(d, m - 1) % q;int p = 0;int t = 0; for (int i = 0; i < m; i++) { // preprocessingp = (d * p + strPattern[i]) % q;t = (d * t + strPattern[i]) % q; }for (int s = 0; s < n - m + 1; s++) {if (p = t) { if (IsEqual(strPattern, strText + s, m)) printf("Pattern occors with shift %d\n", s);}if (s < n - m)t = (d * (t - strText[s]*h) + strText[s-m]) % q; // 注意}}int main(){//char *strText = "bacbababacaababababacaaabcababacabab";//char *strPattern = "ababaca";char *strText = "aabbaabababaabbaabbaababaa";char *strPattern = "aa";//char *strText = "34254423453442908340242";//char *strPattern = "42";BabinKarpMatcher(strText, strPattern, 26, 29);system("pause");return 0;}

//======================================================// KMP字符串匹配算法 20140914//======================================================#include <stdio.h>#include <stdlib.h>#include <string.h>//======================================================// 用于计算前缀函数//======================================================void ComputePrefixFuntion(char *strPattern, int *piPrefix){int m = strlen(strPattern);piPrefix[0] = 0;int k = -1;for (int q = 1; q < m; q++) {while (k > -1 && strPattern[k + 1] != strPattern[q])k = piPrefix[k] - 1; // 注意if (strPattern[k + 1] == strPattern[q])k = k + 1;piPrefix[q] = k + 1; // 注意}}//==============================================// KMP算法实现,注意数组下标从0开始//==============================================void KMPMatcher(char *strText, char *strPattern){int n = strlen(strText);int m = strlen(strPattern);int *piPrefix = (int *)malloc(sizeof(int) * m);if (!piPrefix) {return ;}for (int k = 0; k < m; k++)piPrefix[k] = 0;ComputePrefixFuntion(strPattern, piPrefix);int q = -1;for (int i = 0; i < n; i++) {while (q > -1 && strPattern[q + 1] != strText[i])q = piPrefix[q] - 1;  // 注意if (strPattern[q + 1] == strText[i])q = q + 1;if (q == m - 1) { // 注意printf("Pattern occurs with shift %d\n", i - m + 1);q = piPrefix[q] - 1;}}free(piPrefix);} int main(){//char *strText = "bacbababacaababababacaaabcababacabab";//char *strPattern = "ababaca";char *strText = "aabbaabababaabbaabbaababaa";char *strPattern = "aa";KMPMatcher(strText, strPattern);system("pause");return 0;}


0 0
原创粉丝点击