字符串的模式匹配实现
字符串的模式匹配

字符串的模式匹配前⾔:记得⼤⼆学习字符串匹配也只是把书上的伪代码看懂,原理搞明⽩,也就没有亲⾃去实现代码,⽽且⾃⼰也不是搞算法的,所以偶尔做题也很少遇到字符串匹配题,上次考试很尴尬遇到了这种题,虽然知道考的啥,但是写不出代码,很是尴尬,所以今天就花点时间把知识回顾⼀下,并把代码实现。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1:模式匹配模式匹配(Pattern Matching) 即⼦串定位运算(Index函数)。
算法⽬的:确定主串中所含⼦串第⼀次出现的位置(定位) ——即如何实现 Index(S,T,pos)函;初始条件:串S和T存在,T是⾮空串,1≤pos≤StrLength(s) 操作结果:若主串S中存在和串T值相同的⼦串,则返回它在主串S中第pos个字符之后第⼀次出现的位置;否则函数值为0。
注:S称为被匹配的串,T称为模式串。
若S包含串T,则称“匹配成功”。
否则称 “匹配不成功” 。
常见的两种算法:BF算法(⼜称古典或经典的、朴素的、穷举的)KMP算法(特点:速度快)2:BF算法① BF算法设计思想:将主串的第pos个字符和模式的第1个字符⽐较,若相等,继续逐个⽐较后续字符;若不等,从主串的下⼀字符(pos+1)起,重新与第⼀个字符⽐较。
直到主串的⼀个连续⼦串字符序列与模式相等。
返回值为S中与T匹配的⼦序列第⼀个字符的序号,即匹配成功。
否则,匹配失败,返回值 0 .BF算法的伪代码:算法C++实现1 #include<bits/stdc++.h>23using namespace std;4int BF(string a,int stra,string b,int strb)5 {6int i=0;7int j=0;8while(i<stra && j<strb) 9 {10if(a[i]==b[j])11 {12 i++;13 j++;14 }15else16 {17 i=i-j+1;18 j=0;19 }20 }21if(j>=strb){22 cout << "匹配成功"; 23return i-strb;24 } else25 {26 cout << "匹配失败"; 27return0;28 }29 }30int main()31 {32string a,b;33 cin >> a >> b;34int stra=a.length(); 35int strb=b.length(); 36 BF(a,stra,b,strb);37return0;38 }3:KMP算法算法C++实现1 #include<bits/stdc++.h>23using namespace std;4int next[1000];5void get_next(string str,int stra)6 {7int i=1;8 next[1]=0;9int j=0;10while(i<stra)11 {12if(j==0 || str[i]==str[j])13 {14 ++i;15 ++j;16 next[i]=j;17 }else18 {19 j=next[j];20 }21 }22 }2324int KMP(string a,int stra,string b,int strb) 25 {26int j=1;27int i=0;28while(i<stra && j<=strb)29 {30if(j==0 || a[i]==b[j-1] ){31 i++;32 j++;33 }34else35 {36 j=next[j];37 }38 }39if(j>strb) {40 cout << "匹配成功" << endl;41return i-strb;42 }else43 {44 cout << "匹配失败" << endl;45return -1;46 }47 }48int main()49 {50 memset(next,0,sizeof(next));51string a,b;52 cin >> a >> b;53int stra=a.length();54int strb=b.length();55 get_next(b,strb);56int m=KMP(a,stra,b,strb);57if(m!=-1)58 {59 cout << "匹配的位置在" << m << endl;60 }61return0;62 }。
实现字符串匹配算法,支持正则表达式(JavaScript)

实现字符串匹配算法,支持正则表达式(JavaScript)字符串匹配是计算机领域中常见的操作,当我们需要在一个字符串中查找特定的模式时,可以使用字符串匹配算法来实现。
在实际应用中,经常会用到正则表达式来描述匹配的规则。
在JavaScript中,我们可以使用内置的正则表达式对象来实现字符串匹配。
以下将介绍三种常见的字符串匹配算法:暴力法、KMP算法和正则表达式匹配算法。
1.暴力法(Brute Force)暴力法是最简单直接的字符串匹配算法。
它的基本思想是从目标字符串的每一个字符开始,逐个比较目标字符串和模式字符串的字符,如果相等,则继续比较下一个字符,如果不相等,则将目标字符串的指针回溯到上一个位置的下一个字符位置,重新开始比较。
暴力法的实现代码如下:```javascriptfunction bruteForceSearch(text, pattern) { const m = text.length;const n = pattern.length;for (let i = 0; i <= m - n; i++) {let j;for (j = 0; j < n; j++) {if (text[i + j] !== pattern[j]) {break;}}if (j === n) {return i; //匹配成功,返回起始位置}}return -1; //匹配失败}```2. KMP算法(Knuth-Morris-Pratt)KMP算法是一种高效的字符串匹配算法,它利用已经匹配过的信息避免不必要的比较。
基本思想是构建一个部分匹配表(Partial Match Table),通过部分匹配表可以确定在回溯时应该回溯到的位置。
KMP算法的实现代码如下:```javascript//构建部分匹配表function buildPartialMatchTable(pattern) {const table = [0];let prefixIndex = 0;let suffixIndex = 1;while (suffixIndex < pattern.length) {if (pattern[prefixIndex] === pattern[suffixIndex]) { table[suffixIndex] = prefixIndex + 1;prefixIndex++;suffixIndex++;} else if (prefixIndex === 0) {table[suffixIndex] = 0;suffixIndex++;} else {prefixIndex = table[prefixIndex - 1];}}return table;}// KMP算法匹配function kmpSearch(text, pattern) {const m = text.length;const n = pattern.length;const table = buildPartialMatchTable(pattern);let textIndex = 0;let patternIndex = 0;while (textIndex < m) {if (text[textIndex] === pattern[patternIndex]) { if (patternIndex === n - 1) {return textIndex - n + 1; //匹配成功,返回起始位置}textIndex++;patternIndex++;} else if (patternIndex > 0) {patternIndex = table[patternIndex - 1];} else {textIndex++;}}return -1; //匹配失败}```3.正则表达式匹配JavaScript提供了内置的正则表达式对象RegExp,可以使用正则表达式来进行字符串匹配。
匹配字符串有哪三个主要的方法

匹配字符串有哪三个主要的方法
在编程中,有许多方法可以用来匹配字符串。
以下是三个主要的方法:
1. 字符串比较:这是最基本的方法,通过比较两个字符串是否相等来进行匹配。
您可以使用相等运算符(==)或字符串比较函数来实现。
这种方法适用于简单的匹配需求,例如判断一个字符串是否与给定的模式字符串完全匹配。
2. 正则表达式:正则表达式是一种强大的字符串匹配工具,可以通过定义模式来匹配和搜索符合特定规则的字符串。
正则表达式提供了一种灵活的方式来处理复杂的匹配需求,例如查找特定模式的字符串、提取数据等。
3. 字符串查找算法:字符串查找算法是一种高效的方法,用于在一个字符串中查找另一个字符串或模式的位置。
常用的字符串查找算法包括暴力匹配算法、Knuth-Morris-Pratt(KMP)算法、Boyer-Moore算法等。
这些算法在处理大规模文本搜索和替换时表现出色。
这些方法各有优缺点,您可以根据具体的需求选择适合的方法。
串的模式匹配算法

串的模式匹配算法字符串模式匹配是计算机科学中一种常用的算法。
它是一种检索字符串中特定模式的技术,可以用来在字符串中查找相应的模式,进而完成相应的任务。
字符串模式匹配的基本思想是,用一个模式串pattern去匹配另一个主串text,如果在text中找到和pattern完全匹配的子串,则该子串就是pattern的匹配串。
字符串模式匹配的过程就是在text中搜索所有可能的子串,然后比较它们是否和pattern完全匹配。
字符串模式匹配的算法有很多,其中著名的有暴力匹配算法、KMP算法、BM算法和Sunday算法等。
暴力匹配算法是最简单也是最常用的字符串模式匹配算法,其思想是从主串的某一位置开始,依次比较pattern中每一个字符,如果某个字符不匹配,则从主串的下一位置重新开始匹配。
KMP算法(Knuth-Morris-Pratt算法)是一种更为高效的字符串模式匹配算法,它的特点是利用了已匹配过的字符的信息,使搜索更加有效。
它的实现思想是,在pattern中先建立一个next数组,next数组的值代表pattern中每个字符前面的字符串的最大公共前缀和最大公共后缀的长度,这样可以在主串和模式串匹配失败时,利用next数组跳转到更有可能匹配成功的位置继续搜索,从而提高字符串模式匹配的效率。
BM算法(Boyer-Moore算法)也是一种高效的字符串模式匹配算法,它的实现思想是利用主串中每个字符最后出现的位置信息,以及模式串中每个字符最右出现的位置信息来跳转搜索,从而减少不必要的比较次数,提高搜索效率。
Sunday算法是一种简单而高效的字符串模式匹配算法,它的实现思想是,在主串中搜索时,每次从pattern的最右边开始比较,如果不匹配,则根据主串中下一个字符在pattern中出现的位置,将pattern整体向右移动相应位数,继续比较,这样可以减少不必要的比较次数,提高算法的效率。
字符串模式匹配算法的应用非常广泛,它可以用来查找文本中的关键字,检查一个字符串是否以另一个字符串开头或结尾,查找文本中的模式,查找拼写错误,检查字符串中是否包含特定的字符等。
【字符串匹配】BM(Boyer-Moore)字符串匹配算法详解总结(附C++实现代码)

【字符串匹配】BM(Boyer-Moore)字符串匹配算法详解总结(附C++实现代码)BM算法思想的本质上就是在进⾏模式匹配的过程中,当模式串与主串的某个字符不匹配的时候,能够跳过⼀些肯定不会匹配的情况,将模式串往后多滑动⼏位。
BM算法寻找是否能多滑动⼏位的原则有两种,分别是坏字符规则和好后缀规则。
坏字符规则:我们从模式串的末尾往前倒着匹配,当我们发现某个字符⽆法匹配时,我们把这个⽆法匹配的字符叫做坏字符(主串中的字符)。
此时记录下坏字符在模式串中的位置si,然后拿坏字符在模式串中查找,如果模式串中并不存在这个字符,那么可以将模式串直接向后滑动m位,如果坏字符在模式串中存在,则记录下其位置xi,那么模式串向后移动的位数就是si-xi,(可以在确保si>xi,执⾏减法,不会出现向前移动的情况)。
如果坏字符在模式串中多次出现,那我们在计算xi的时候,选择最靠后的那个,这样不会因为让模式串滑动过多,导致本来可能匹配的情况被略过。
好后缀规则:在我们反向匹配模式串时,遇到不匹配时,记录下当前位置j位坏字符位置。
把已经匹配的字符串叫做好后缀,记作{u}。
我们拿它在模式串中查找,如果找到了另⼀个跟{u}相匹配的字串{u*},那么我们就将模式串滑动到字串{u*}与主串{u}对齐的位置。
如下图所⽰:如果在模式串中找不到另⼀个等于{u}的⼦串,我们就直接将模式串滑动到主串中{u}的后⾯,因为之前的任何⼀次往后滑动,都没有匹配主串中{u}的情况。
但是这种滑动做法有点太过头了,可以看下⾯的例⼦,如果直接滑动到好后缀的后⾯,可能会错过模式串与主串可以匹配的情况。
如下图:当模式串滑动到前缀与主串中{u}的后缀有部分重合的时候,并且重回部分相等的时候,就可能会存在完全匹配的情况。
所以针对这种情况我们不仅要看好后缀在模式串中,是否有另⼀个匹配的字串,我们还要考察好后缀的后缀字串是否存在跟模式串的前缀字串匹配的情况。
如下图所⽰:最后总结如何确定模式串向后滑动的位数,我们可以分别计算好后缀和坏字符往后滑动的位数,然后取两个数中最⼤的。
简述串的模式匹配原理

简述串的模式匹配原理嘿,咱聊聊串的模式匹配原理呗!这串的模式匹配,听着挺神秘,其实也不难理解。
就像在一堆宝藏里找宝贝。
啥是串的模式匹配呢?简单说,就是在一个大字符串里找一个小字符串。
这就像在一片大海里找一条小鱼。
你得有办法才能找到它。
比如说,你想在一篇文章里找一个特定的词,这就是串的模式匹配。
那怎么找呢?有好几种方法呢。
一种是暴力匹配。
这就像一个愣头青,一个一个地比对。
从大字符串的开头开始,一个字符一个字符地和小字符串比对。
如果不一样,就往后移一个字符,继续比对。
这就像在一堆沙子里找一颗小石子,得一颗一颗地找。
虽然有点笨,但是有时候也能管用。
还有一种是KMP 算法。
这就像一个聪明的侦探,有自己的一套方法。
它会先分析小字符串的特点,然后根据这些特点来快速匹配。
比如说,如果在比对的过程中发现不一样了,它不会像暴力匹配那样从头开始,而是根据之前的分析,直接跳到合适的位置继续比对。
这就像你知道了宝藏的线索,就能更快地找到宝藏。
串的模式匹配有啥用呢?用处可大了。
比如说,在文本编辑软件里,你想查找一个特定的词或者句子,就用到了串的模式匹配。
还有在搜索引擎里,也是用串的模式匹配来找到你想要的信息。
这就像你有一把神奇的钥匙,能打开知识的大门。
你说要是没有串的模式匹配,那会咋样呢?那找东西可就麻烦了。
就像在一个乱七八糟的房间里找东西,没有头绪,得翻个底朝天。
有了串的模式匹配,就像有了一个指南针,能让你更快地找到你想要的东西。
总之,串的模式匹配就像一个神奇的工具,能在大字符串里找到小字符串。
咱可得好好理解它,让它为我们的生活带来更多的便利。
字符串模式匹配bf算法
BF算法,也就是Brute Force算法,是一种基本的字符串模式匹配算法。
它通过遍历文本串,逐一比较字符来实现模式匹配。
以下是BF算法的800字说明:1. 算法原理BF算法的基本原理是在文本串中从左到右依次扫描,对于扫描到的每一个位置,将该位置的文本与模式串中的每个模式字符进行比较,以确定是否存在匹配。
如果找到了匹配,则算法结束;否则,继续扫描下一个位置。
2. 算法步骤(1)初始化两个指针,一个指向文本串的起始位置,另一个指向模式串的起始位置;(2)比较起始位置的字符是否匹配,如果不匹配则算法结束;(3)如果匹配,移动两个指针,分别到下一个位置继续比较;(4)重复步骤(2)和(3),直到文本串完全扫描完或者没有匹配到为止。
3. 算法时间复杂度BF算法的时间复杂度是O(n*m),其中n是文本串的长度,m是模式串的长度。
这是因为每次比较都需要花费一定的时间,而整个过程需要比较n-m+1次。
4. 算法优缺点优点:简单易懂,实现起来相对容易。
缺点:时间复杂度较高,对于较长的文本串和模式串,效率较低。
此外,BF算法只能用于查找单一的模式,对于多个模式的查找需要使用其他算法。
5. 实际应用BF算法在实际应用中主要用于文本搜索、模式匹配等场景。
例如,在搜索引擎中,BF算法常被用于网页的关键词匹配和搜索结果排序。
此外,BF算法还可以用于病毒扫描、文件校验等领域。
总之,BF算法是一种基本的字符串模式匹配算法,适用于简单的文本搜索和模式匹配场景。
虽然其时间复杂度较高,但对于一些特定的应用场景,BF算法仍然是一种有效的方法。
当然,随着计算机技术的发展,还有很多高效的模式匹配算法被提出,如KMP算法、BM算法、Rabin-Karp算法等,可以根据具体应用场景选择合适的算法。
字符串模式匹配
实验7、字符串查找目的掌握字符串模式匹配的经典算法。
问题描述分别用简单方法和KMP方法实现index在文本串中查找指定字符串的功能。
步骤1.定义字符串类型2.实现简单的index操作,从文本串中查找指定字符串。
3.实现KMP方法的index操作,从文本串中查找指定字符串。
4.[选]建立一个文本文件,读入每一行来测试自己完成的练习,观察并理解程序的各个处理。
设备和环境PC计算机、Windows操作系统、C/C++开发环境结论能够理解和掌握字符串模式匹配的典型算法。
思考题1.对KMP算法分别用手工和程序对某个模式串输出next和nextval。
朴素算法:#include<stdio.h>#include<string.h>#define NOTFOUND -1#define ERROR -2#define MAXLEN 100//字符串的最大长度char S[MAXLEN+10],T[MAXLEN+10],st[MAXLEN+10];//串S和串Tint S0,T0; //S0:串S的长度 T0:串T的长度int pos; //pos的起始位置void Init(char *S,int &S0)//读入字符串{int len,i;New_Input:scanf("%s",st);//读入字符串len=strlen(st);if (len>MAXLEN)//如果字符串的长度大于规定的字符串最大长度 {printf("This String is too long,Please Input a new one.nn");goto New_Input;//重新读入字符串}for (i=1;i<=len;i++) S[i]=st[i-1];S[len+1]='';S0=len;}int Index(char *S,char *T,int pos){if (pos<1 || pos>S0) return ERROR; // 输入数据不合法int i=pos,j=1;while (i<=S0 && j<=T0){if (S[i]==T[j]) {i++; j++;}else {i=i-j+2; j=1;}//不匹配时,对应S移到下一位进行匹配}if (j>T0) return i-T0; //返回S中找到的位置else return NOTFOUND;}int main(){int ret;//函数返回值Init(S,S0);Init(T,T0);scanf("%d",&pos);ret=Index(S,T,pos); //在S串中从pos这个位置起,找到第一个与T匹配的子串的起始位置if (ret==NOTFOUND) printf("Not Found.n");else if(ret==ERROR) printf("The Input Data is Error.n");else printf("In S,from %dth is equal to T.n",ret);return 0;}KMP:#include<stdio.h>#include<string.h>#define NOTFOUND -1#define ERROR -2#define MAXLEN 100//字符串的最大长度char S[MAXLEN+10],T[MAXLEN+10],st[MAXLEN+10]; //串S和串Tint S0,T0; //S0:串S的长度 T0:串T的长度int pos; //pos的起始位置int next[MAXLEN+10];void Init(char *S,int &S0)//读入字符串{int len,i;New_Input:scanf("%s",st);//读入字符串len=strlen(st);if (len>MAXLEN)//如果字符串的长度大于规定的字符串最大长度{printf("This String is too long,Please Input a new one.nn");goto New_Input; //重新读入字符串}for (i=1;i<=len;i++) S[i]=st[i-1];S[len+1]='';S0=len;}void Get_next(char *S,int *next){int i=1,j=0;next[1]=0;while (i<T0)if (j==0 || T[i]==T[j]) {i++; j++; next[i]=next[j];}else j=next[j];}int Index_KMP(char *S,char *T,int pos){int i=pos,j=1;while (i<=S0 && j<=T0)if (j==0 || S[i]==T[j]) {i++; j++;}else j=next[j];if (j>T0) return i-T0;else return NOTFOUND;}int main(){int ret;//函数返回值Init(S,S0);Init(T,T0);scanf("%d",&pos);Get_next(T,next);ret=Index_KMP(S,T,pos); //在S串中从pos这个位置起,找到第一个与T匹配的子串的起始位置if (ret==NOTFOUND) printf("Not Found.n");else if (ret==ERROR) printf("The Input Data is Error.n");else printf("In S,from %dth is equal to T.n",ret);return 0;}扩张KMP:#include<stdio.h>#include<string.h>#define NOTFOUND -1#define ERROR -2#define MAXLEN 100 //字符串的最大长度char S[MAXLEN+10],T[MAXLEN+10],st[MAXLEN+10]; //串S和串Tint S0,T0; //S0:串S的长度 T0:串T 的长度int pos; //pos的起始位置int nextval[MAXLEN+10];void Init(char *S,int &S0)//读入字符串{int len,i;New_Input:scanf("%s",st); //读入字符串len=strlen(st);if (len>MAXLEN) //如果字符串的长度大于规定的字符串最大长度{printf("This String is too long,Please Input a new one.nn");goto New_Input; //重新读入字符串}for (i=1;i<=len;i++) S[i]=st[i-1];S[len+1]='';S0=len;}void Get_nextval(char *S,int *nextval){int i=1,j=0;nextval[1]=0;while (i<T0)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];}int Index_KMP(char *S,char *T,int pos){int i=pos,j=1;while (i<=S0 && j<=T0)if (j==0 || S[i]==T[j]) {i++; j++;}else j=nextval[j];if (j>T0) return i-T0;else return NOTFOUND;}int main(){int ret;//函数返回值Init(S,S0);Init(T,T0);scanf("%d",&pos);Get_nextval(T,nextval);ret=Index_KMP(S,T,pos); //在S串中从pos这个位置起,找到第一个与T匹配的子串的起始位置if (ret==NOTFOUND) printf("Not Found.n");else if (ret==ERROR) printf("The Input Data is Error.n");else printf("In S,from %dth is equal to T.n",ret);return 0;}。
KMP模式匹配算法
KMP模式匹配算法KMP算法是一种字符串匹配算法,用于在一个主串中查找一个模式串的出现位置。
该算法的核心思想是通过预处理模式串,构建一个部分匹配表,从而在匹配过程中尽量减少不必要的比较。
KMP算法的实现步骤如下:1.构建部分匹配表部分匹配表是一个数组,记录了模式串中每个位置的最长相等前后缀长度。
从模式串的第二个字符开始,依次计算每个位置的最长相等前后缀长度。
具体算法如下:-初始化部分匹配表的第一个位置为0,第二个位置为1- 从第三个位置开始,假设当前位置为i,则先找到i - 1位置的最长相等前后缀长度记为len,然后比较模式串中i位置的字符和模式串中len位置的字符是否相等。
- 如果相等,则i位置的最长相等前后缀长度为len + 1- 如果不相等,则继续判断len的最长相等前后缀长度,直到len为0或者找到相等的字符为止。
2.开始匹配在主串中从前往后依次查找模式串的出现位置。
设置两个指针i和j,分别指向主串和模式串的当前位置。
具体算法如下:-当主串和模式串的当前字符相等时,继续比较下一个字符,即i和j分别向后移动一个位置。
-当主串和模式串的当前字符不相等时,根据部分匹配表确定模式串指针j的下一个位置,即找到模式串中与主串当前字符相等的位置。
如果找到了相等的位置,则将j移动到相等位置的下一个位置,即j=部分匹配表[j];如果没有找到相等的位置,则将i移动到下一个位置,即i=i+13.检查匹配结果如果模式串指针j移动到了模式串的末尾,则说明匹配成功,返回主串中模式串的起始位置;如果主串指针i移动到了主串的末尾,则说明匹配失败,没有找到模式串。
KMP算法的时间复杂度为O(m+n),其中m为主串的长度,n为模式串的长度。
通过预处理模式串,KMP算法避免了在匹配过程中重复比较已经匹配过的字符,提高了匹配的效率。
总结:KMP算法通过构建部分匹配表,实现了在字符串匹配过程中快速定位模式串的位置,减少了不必要的比较操作。
数据结构—串的模式匹配
数据结构—串的模式匹配数据结构—串的模式匹配1.介绍串的模式匹配是计算机科学中的一个重要问题,用于在一个较长的字符串(称为主串)中查找一个较短的字符串(称为模式串)出现的位置。
本文档将详细介绍串的模式匹配算法及其实现。
2.算法一:暴力匹配法暴力匹配法是最简单直观的一种模式匹配算法,它通过逐个比较主串和模式串的字符进行匹配。
具体步骤如下:1.从主串的第一个字符开始,逐个比较主串和模式串的字符。
2.如果当前字符匹配成功,则比较下一个字符,直到模式串结束或出现不匹配的字符。
3.如果匹配成功,返回当前字符在主串中的位置,否则继续从主串的下一个位置开始匹配。
3.算法二:KMP匹配算法KMP匹配算法是一种改进的模式匹配算法,它通过构建一个部分匹配表来减少不必要的比较次数。
具体步骤如下:1.构建模式串的部分匹配表,即找出模式串中每个字符对应的最长公共前后缀长度。
2.从主串的第一个字符开始,逐个比较主串和模式串的字符。
3.如果当前字符匹配成功,则继续比较下一个字符。
4.如果当前字符不匹配,则根据部分匹配表的值调整模式串的位置,直到模式串移动到合适的位置。
4.算法三:Boyer-Moore匹配算法Boyer-Moore匹配算法是一种高效的模式匹配算法,它通过利用模式串中的字符出现位置和不匹配字符进行跳跃式的匹配。
具体步骤如下:1.构建一个坏字符规则表,记录模式串中每个字符出现的最后一个位置。
2.从主串的第一个字符开始,逐个比较主串和模式串的字符。
3.如果当前字符匹配成功,则继续比较下一个字符。
4.如果当前字符不匹配,则根据坏字符规则表的值调整模式串的位置,使模式串向后滑动。
5.算法四:Rabin-Karp匹配算法Rabin-Karp匹配算法是一种基于哈希算法的模式匹配算法,它通过计算主串和模式串的哈希值进行匹配。
具体步骤如下:1.计算模式串的哈希值。
2.从主串的第一个字符开始,逐个计算主串中与模式串长度相同的子串的哈希值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
试验四
课程名称实验室名称
实验名称字符串的模式匹配实现
指导教师成绩
1、实验目的
字符串的模式匹配实现
2、实验原理和内容
能够使用标志变量去实现程序的某种功能的判定,充分利用while循环语句实现模式匹配并能判定模式匹配是否成功.
3、实验步骤
1.数据结构类型的定义
2.编写insert函数寻找字符串p在字符串t中首次出现的起始位置,定义一个标志变量suc,判断匹配是否成功,若成功,返回起始位置,否则返回-1
3.编写主函数,将字符串p和字符串t的长度先赋值给p.length和t.length,打印输出所需查找的模式串在主串中的起始位置
4、程序及运行结果(或实验数据记录及分析)
#include<stdio.h>
#define maxsize 100
typedef struct{
char str[maxsize];
int length ;
}seqstring;
int index(seqstring p, seqstring t)
{
int i,j, suc;
i=0; suc=0;
while((i<=t.length-p.length) && (!suc))
{
j=0 ; suc=1;
while ((j<=p.length-1) && suc)
if (p.str[j]==t.str[i+j] ) j++;
else
suc=0;
++i;
}
if (suc) return (i-1);
else return (-1);
}
main()
{
seqstring t, p;
int sum;
printf("请输入主串t:");
scanf("%s",t.str);
t.length=strlen(t.str);
printf("请输入所需查找的子串p:");
scanf("%s",p.str);
p.length=strlen(p.str);
sum=index(p,t);
printf("\n");
if (sum==-1) printf("no found");
else
printf("所需查找子串第一次出现的位置是:%d",sum+1); }
在屏幕上输出的结果:。