字符串匹配
来源:互联网 发布: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
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配...
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 安装配置 CentOS6.5 minimal 遇到的问题
- Oracle锁的机制。
- linux zip/unzip命令详解
- 虚拟机堆OutOfMemoryError异常
- hdu 5007 Post Robot 水题 2014 ACM/ICPC Asia Regional Xi'an Online
- 字符串匹配
- mongodb 副本集创建(一)
- 记录华为中央研究院的面试20140913
- 高效时间管理-介绍GTD
- SAE平台下搭建个人博客WORDPRESS
- 配置win2008防火墙 允许被Ping的设置方法
- Dinic非递归版(优化)
- 简单工厂、工厂方法、抽象工厂之小结与区别
- POJ Fence Repair-哈夫曼树思想