#include <string.h>
#include<stdio.h>
/*
BBC ABCDAB ABCDABCDABDE
搜索词"ABCDABD"*/
//如果pattern存在org中,那么返回的是首次出现的org的角标
//否则返回的是-1
int index(char strOrg[], char strPattern[]) {int i = 0, j = 0;//i是用来推进strOrg,j是用来推进strPattern的int k = -1;//k是用来返回org中的角标的,默认的我们认为不存在int orgLength = strlen(strOrg);int patternLength = strlen(strPattern);int count = 0;while (i < orgLength && j < patternLength) {if (strOrg[i] == strPattern[j]) {//此时,原串不要向下移动,而是从当前位置开始,看是否有匹配的子串存在i++;j++;}else {i = i - j + 1;j = 0;}count++;}printf("本算法运行了%d次\n", count);if (j >= patternLength) {k = i - patternLength;}return k;
}//****************************Beging KMP
#define MAXLENGTH 1024
//部分匹配值的计算
void GetNext(char str[], int next[]) {int j = 0;int k = -1;next[0] = -1;while (j < strlen(str)) {if (k == -1 || str[j] == str[k]) {j++;k++;next[j] = k;}elsek = next[k];}
}int KMPIndex(char strOrg[], char strPattern[]) {int next[MAXLENGTH], i = 0, j = 0, pos = -1;GetNext(strPattern, next);//获得patter串中的每一个字符的部分匹配值int orgLength = strlen(strOrg);int patternLength = strlen(strPattern);int count = 0;while (i < orgLength && j < patternLength) {if (j == -1 || strOrg[i] == strPattern[j]) {i++;j++;}else {j = next[j];}count++;}//printf("\n");printf("本次检索我们一共运行了%d次", count);if (j >= patternLength) {pos = i - patternLength;}return pos;
}//****************************END KMPint main(void) {//printf("%d ", index("BBC ABCDAB ABCDABCDABDE", "ABCDABD"));printf("%d ", KMPIndex("BBC ABCDAB ABCDABCDABDE", "ABCDABD"));getchar();return 0;
}


KMP算法

字符串匹配算法  KMP
#include<stdio.h>
//串的定长顺序存储表示
#define MAXSTRLEN 50  // // 用户可在50以内定义最大串长
#define  MAXLEN 255
typedef struct{char ch[MAXLEN+1];
int length;
}SString;
char   next[MAXLEN];int indexBF(SString S, SString T, int pos){int i = pos, j = 1;while(i <= S.length && j <= T.length){if(j==0||S.ch[i]==T.ch[j]){i++;j++;}else{j = next[j];}if(j>T.length)  return i-T.length;else   return 0;
}
}
void  getnext(SString  T,int next[]){int i,j;
i=1;
next[1]=0;
j=0;
while(i<T.length)
{if(j==0||T.ch[i]==T.ch[j]){++i;++j;next[i]=j;
}
else  j=next[j];
}
}
void init(SString &S, char str[]){int i = 0;while(str[i]!='\0'){S.ch[i+1] = str[i];i++;}S.ch[i+1] = '\0';S.ch[0] = i;
}
void printStr(SString Str){for(int i = 1; i <= Str.ch[0]; i++){printf("%c", Str.ch[i]);}printf("\n");
}
void main(){SString S ;init(S, "ababcabcacbab");printStr(S);SString T;init(T, "abcac");printStr(T);int index = indexBF(S, T, 1);printf("index is %d\n", index);
}

字符串BF和KMP匹配算法相关推荐

  1. 数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)

    文章目录 一.Brute Force 匹配算法 二.Rabin–Karp 匹配算法 三.Knuth–Morris–Pratt 匹配算法 四.Boyer-Moore-Horspool 匹配算法 五.字符 ...

  2. BF、KMP、BM、Sunday算法讲解

    原文地址: https://www.cnblogs.com/Syhawk/p/4077295.html BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中 ...

  3. python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配

    问题: 已知字符串 B 是字符串 A 的一个子串,问字符串 B 在字符串 A 的第一次出现位置. 暴力方法:从 A 字符串 的每个位置开始对字符串 B 进行匹配. 这种方法根据数据的不同 复杂度不同最 ...

  4. 朴素匹配算法、KMP匹配算法及其改进【C Program】

    之前代码有点小问题,现在可以了~ 朴素匹配算法 原理: 定义主串:CSGOCSDN 定义子串:CSDN 匹配不到就以此后移直至匹配成功或失败. 代码: #include <stdio.h> ...

  5. 字符串匹配算法(BF、KMP)

    BF算法 描述: BF,Brute Force,暴力匹配的意思,是最简单直观的字符串匹配算法.假设有主串s1和子串s2,根据BF算法判断s1是否包含s2的步骤如下: 初始下标指针 i, j 分别指向s ...

  6. 字符串匹配算法(BF算法KMP算法)

    字符串匹配算法 暴力匹配(BF)算法 KMP算法 next数组 求next数组的练习 next数组的优化(nextval数组) 练习 暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算 ...

  7. 列宽一字符等于多少厘米_字符串匹配算法总结——BF、KMP、BM

    说明 以下算法介绍中,被匹配字符串称为主串,匹配模式字符串称为匹配串,索引从0开始. 前缀数组:字符串S = AB(B !== ⏀,即B为任一非空字符串) ,S的前缀指A.前缀数组指所有包含第一个字符 ...

  8. 字符串匹配算法---BF及KMP

    字符串匹配的一般算法(BF)     以 ABSABABCEF 与 ABCE 为例,求串2与串1匹配的第一个位置的下标(这里即输出 5),一般的,我们可以从串1的起始位置开始与串2比较,若相同则两串都 ...

  9. 字符串匹配算法BF,BM,KMP

    字符串匹配bf算法:(暴力穷举算法) 在一个字符串中寻找另一字符串,最容易想到的,也是最简单的办法是:取主串和模式串/搜索串中的每一位依次比较,如果匹配则同时后移一位继续比较,直至匹配到模式串的最后一 ...

最新文章

  1. python微信红包代码_有了这个再也不担心任何微信红包,Python就是好用
  2. cuda 判断nan 处理办法
  3. 【Unity】第8章 GUI开发
  4. 【元胞自动机】基于matlab元胞自动机车流密度不变下的双向两车道仿真(T 字形路口)【含Matlab源码 1290期】
  5. 《淘宝网开店 进货 运营 管理 客服 实战200招》——1.3 常见网上开店平台
  6. 计算机维修技师论文,2016年电工技师论文范文10篇
  7. 社会统计分析—基础知识
  8. sql 计算周环比wow_Oracle计算环比的方法
  9. 【从零开始的SDN学习之路】之闲话Neutron与SDN的联系
  10. 逻辑回归模型logistic原理详解
  11. ICPR MTWI 2018挑战赛 网络图像的文本识别之数据预处理
  12. manjaro安装后需要做的几件事
  13. 托盘图标在explorer.exe进程退出重启后图标消失(应用程序进程依然存在)的问题
  14. GitHub加载过慢或加载不出来应该怎么解决
  15. 太赫兹技术将颠覆公共场所安检方式
  16. 如何自学维修计算机,怎样快速学习汽车电脑维修?从入门到精通
  17. BP神经网络在双色球彩票上的预测实验及实现
  18. 矩阵连乘(java版)
  19. jQuery仿探探APP手机滑动 卡片切换 特效
  20. 数据连接 3G ppp pppd

热门文章

  1. asp php 语法区别,asp与php语法对比
  2. linux init进程是所有用户进程的祖先进程,Linux中init进程介绍及常用方法
  3. minheight能继承吗_借父母名买房到底归谁?其他兄妹能继承吗?
  4. Load和Initialize往死了问是一种怎样的体验?
  5. iOS -- UIApplication
  6. 单身程序猿适合找单身程序媛吗?
  7. Servlet3.0之九:web模块化
  8. 8天学通MongoDB——第七天 运维技术
  9. SQLServer查询指定日期
  10. 简单tc流量控制使用