字符串匹配(BF算法和KMP算法及改进KMP算法)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<cstring>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255 //用户可在255以内定义最长串长
typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度
Status StrAssign(SString T, char *chars) { //生成一个其值等于chars的串T
int i;
if (strlen(chars) > MAXSTRLEN)
return ERROR;
else {
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1);
return OK;
}
}
void get_next(SString T, int next[]){ //求模式串T的next函数值并存入数组next
int i = 1, j = 0;
next[1] = 0;
while (i < T[0])
if (j == 0 || T[i] == T[j])
{
++i;
++j;
next[i] = j;
}//abssgaaadaaaadcf aaaad 0
else
j = next[j];
for(i=1;i<strlen(T);i++)
printf("j=%d next[%d]=%d \n",i,i,next[i]);//abssgaaadaaaadcf aaaad 0
}//get_next
void get_nextval(SString T, int nextval[]){ // 求模式串T的next函数修正值并存入数组nextval
int i = 1, j = 0;
nextval[1] = 0;
while (i < T[0])
if (j == 0 || T[i] == T[j])
{
++i;
++j;
if (T[i] != T[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
} else
j = nextval[j];
for(i=1;i<strlen(T);i++)
printf("j=%d nextval[%d]=%d \n",i,i,nextval[i]);
}//get_nextval
//
void BF(char s[100],char p[50],int t){
int space,a,b,k=0,num=0;
int pos, i, j, flag;
j = flag = 0;
if(strlen(s)<strlen(p)){
printf("Error:子串长度大于父串.\n");
return ;
}
if(strlen(s)-strlen(p)<t){
printf("Error:匹配位置不合适.\n");
return ;
}
space=i=pos=t;
printf("\n");
while(i < strlen(s))
{
if(j==0&&s[i]!=p[j])
num++;
pos=i;
if(p[j] == s[i]){
while(j < strlen(p))
{
if(p[j] != s[i])
{
k++;
printf("%s %d 此次匹配失败\n",s,k);
for(a=space;a>0;a--)
printf(" ");//输出详细过程
for(b=0;b<=j;b++)
printf("%c",p[b]);//aaadddawawdcw awd 0
printf("\n");
break;
}
else{
k++;
printf("%s %d 此次匹配成功\n",s,k);
for(a=space;a>0;a--)
printf(" ");//输出详细过程
for(b=0;b<=j;b++)
printf("%c",p[b]);
printf("\n");
i++;
j++;
}
}
if(j == strlen(p))
flag = 1;
}
else{
k++;
printf("%s %d 此次匹配失败\n",s,k);//aaadddawawdcw awd 0
for(a=space;a>0;a--)
printf(" ");
printf("%c\n",p[j]) ;
}
space++;
if(flag == 1){//如果匹配成功,flag=1,则进入此句;
printf("匹配位置为:%d\n", pos);
break;
}
//开始下一轮的循环,对某些变量进行初始化
i = ++pos;
j = 0;
if(i > strlen(s) - strlen(p)){
printf("主串中不存在此子串!\n");
break;
}
}
printf("共匹配%d次\n",k);
printf("单个字符匹配次数为%d\n",num);
}
int KMP(SString S, SString T, char* s, char* p, int pos, int next[]){ // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法
//其中,T非空,1≤pos≤StrLength(S)
if(strlen(s)<strlen(p)){
printf("Error:子串长度大于父串.\n");
return -1;
}
if(strlen(s)-strlen(p)<pos){
printf("Error:匹配位置不合适.\n");
return -1;
}
int i = pos, j = 1,k=0,a,b,space=0;
while (i <= S[0] && j <= T[0])
{
if (j == 0 || S[i] == T[j]) // 继续比较后继字
{
i++;
j++;
if(j == strlen(T))
{ // 进入此if语句即表示匹配成功
printf("共循环%d次\n",k);
break;
}
++k;
printf("%s %d next[%d]=%d \n",s,k,j,next[j]);
for(a=space;a>0;a--)
printf(" ");
for(b=1;b<=j;b++)
printf("%c",T[b]);//abssgaaadaaaadcf aaaad 0
printf("\n");
if(j==1&&S[i]!=T[j]) simple++;//记录单字符匹配失败的次数。
}
else j = next[j];// 模式串向右移动
space=i-j; //输出子串前面的空格数
}
printf("单字符循环%d次\n",simple);
if (j > T[0]) // 匹配成功
return i - T[0];
else
return -1;
}//Index_KMP
int main(){
printf("1.输入主串、子串和匹配起始位置\n2.BF算法\n3.KMP算法\n4.KMP改进算法\n0.退出\n");
int t = -1,place;
SString S;//abssgaaadaaaadcf aaaad 0
SString T;
int *next,*nextval;
char s[50], p[50];
while(t)
{
printf("请输入:");
scanf("%d",&t);
switch(t)
{
case 0:
break;
case 1:
printf("请输入主串、子串和匹配起始位置:\n");
scanf("%s%s%d",s,p,&place);
StrAssign(S,s) ;
StrAssign(T,p) ;
break;
case 2:
BF(s,p,place);
break;
case 3:
next = new int[T[0]+1];
get_next(T,next);
printf("匹配的位置为 %d\n",KMP(S,T,s,p,place,next));
break;
case 4:
nextval = new int[T[0]+1];
get_nextval(T,nextval) ;
printf("匹配的位置为 %d\n",KMP(S,T,s,p,place,nextval));
break;
default:
break;
}
}
return 0;
}
字符串匹配(BF算法和KMP算法及改进KMP算法)的更多相关文章
- 字符串匹配-BF算法和KMP算法
声明:图片及内容基于https://www.bilibili.com/video/av95949609 BF算法 原理分析 Brute Force 暴力算法 用来在主串中查找模式串是否存以及出现位置 ...
- BF算法和KMP算法
这两天复习数据结构(严蔚敏版),记录第四章串中的两个重要算法,BF算法和KMP算法,博主主要学习Java,所以分析采用Java语言,后面会补上C语言的实现过程. 1.Brute-Force算法(暴力法 ...
- 字符串匹配的BF算法和KMP算法学习
引言:关于字符串 字符串(string):是由0或多个字符组成的有限序列.一般写作`s = "123456..."`.s这里是主串,其中的一部分就是子串. 其实,对于字符串大小关系 ...
- 串匹配模式中的BF算法和KMP算法
考研的专业课以及找工作的笔试题,对于串匹配模式都会有一定的考察,写这篇博客的目的在于进行知识的回顾与复习,方便遇见类似的题目不会纠结太多. 传统的BF算法 传统算法讲的是串与串依次一对一的比较,举例设 ...
- 串的模式匹配 BF算法和KMP算法
设有主串s和子串t,子串t的定位就是要在主串中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配. 模式匹配成功是指在目标串s中找到一个模式串t: 不成功则 ...
- 【模板】字符串匹配的三种做法(Hash、KMP、STL)
题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 输入输出格式 输入格式: 第一行为一个字符串,即为s1 第二行为一个字符串,即为s2 输出格式: 1行 ...
- 字符串匹配:从机器到后缀自己主动KMP
后缀自己主动机(sam)对字符串匹配 ==== 我们已经配置了一个相对较短的模式字符串sam. 为P="abcabcacab", T[1..i]后缀.因此,它是sam最长前缀长度: ...
- Bellman-Ford算法的改进---SPFA算法
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.算法思想 Bellman-Ford算法时间复杂度比较高,在于Bellman-Ford需要递推n次,每次递推需要扫描所有的 ...
- BF算法和KMP算法(javascript版本)
var str="abcbababcbababcbababcabcbaba";//主串 var ts="bcabcbaba";//子串 function BF( ...
随机推荐
- WPF主窗体调用 User32的SetWindowPos 设置窗体置顶会导致与其他窗体抢夺焦点的问题
最近发现:自己开发的窗体应用,在二级弹窗或者提示框弹出的时候,交替点击窗体和窗体外(相当于窗体交替的获取焦点和失去焦点),都会导致其他的应用一闪一闪的. 经过排查,是由于该窗体由于部分因素考虑,用了 ...
- identity4 系列————启航篇[二]
前言 开始identity的介绍了. 正文 前文介绍了一些概念,如果概念不清的话,可以去前文查看. https://www.cnblogs.com/aoximin/p/13475444.html 对一 ...
- Git 使用技巧(一):合并分支
在合并分支之前最好保证你所有的分支都是最新的,所以你可以使用 git pull origin branchName 来拉取远程仓库到本地仓库. 假如有一个 dev 分支需要合并到 master 分支中 ...
- 使用Python批量爬取美女图片
运行截图 实列代码: from bs4 import BeautifulSoup import requests,re,os headers = { 'User-Agent': 'Mozilla/5. ...
- 跟我学Python图像处理丨何为图像的灰度非线性变换
摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...
- KingbaseES 数据库软件卸载
关键字: KingbaseES.卸载 一.安装后检查 在安装完成后,可以通过以下几种方式进行安装正确性验证: 1. 查看安装日志,确认没有错误记录; 2. 查看开始菜单: 查看应用程序菜单中是否安 ...
- jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)
前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...
- WinForm完美实现Cefsharp-v49控件C#与JS交互,并且可加载运行flash
https://blog.csdn.net/zhao331863874/article/details/117328415
- 利用高级组策略管理AGPM复制组策略GPO
有时候管理多个林,在一个林中配置了GPO之后,想复制出来用到其它林里.默认系统的组策略管理里没有这个功能.但是微软在微软企业桌面优化套件Microsoft Desktop Optimization P ...
- 2022-9-5 JavaSE note
Java SE 1.IDEA基本操作 psvm + 回车 : main() 方法声明 sout + 回车 : = System.out.println(); Ctrl + D : 把当前行复制到下一行 ...