KMP算法实验
数据结构课程设计 使用kmp算法实现字符串的模式匹配问题

数据结构课程设计使用kmp算法实现字符串的模式匹配问题本次数据结构课程设计将使用KMP算法实现字符串的模式匹配问题。
KMP算法,全称是Knuth-Morris-Pratt算法,它是一种字符串匹配算法,可以用来解决"在一个文本串S内查找一个模式串P的出现位置"这样的问题。
在字符串匹配问题中,最简单朴素的算法就是暴力匹配,它的时间复杂度是O(m*n),其中m为模式串的长度,n为文本串的长度。
而KMP算法通过预处理模式串,使得可以在O(n)的时间内查找出文本串中的所有模式串出现的位置。
具体来说,KMP算法的核心思想是:当匹配失败时,尽可能地跳过已经匹配的部分,从而实现快速匹配。
而跳过已经匹配的部分的方法则是通过对模式串进行预处理,得到一个next数组,next数组中存放的是当当前字符匹配失败后,应该跳过已匹配的字符数量,从而能够加速匹配。
下面是使用KMP算法实现字符串模式匹配的主要步骤:1.预处理模式串,得到next数组2.在文本串S中,按照模式串P进行匹配,记录匹配成功的位置3.如果匹配成功,则将模式串和文本串移到下一个位置继续匹配4.如果匹配失败,则根据next数组跳过已匹配的字符数量,从而加速匹配本次课程设计的具体任务包括:1.了解KMP算法的基本原理和实现方法2.使用C++语言实现KMP算法,可以参考以下代码:```c++#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 1e6 + 10;char p[N], s[N];int ne[N];int main(){cin >> s + 1 >> p + 1;int n = strlen(s + 1), m = strlen(p + 1);//预处理next数组for(int i = 2, j = 0; i <= m; i++){while(j && p[i] != p[j + 1]) j = ne[j];if(p[i] == p[j + 1]) j++;ne[i] = j;}//匹配过程for(int i = 1, j = 0; i <= n; i++){while(j && s[i] != p[j+1]) j = ne[j];if(s[i] == p[j+1]) j++;if(j == m){printf("%d ", i - m);j = ne[j];}}return 0;}```3.使用自己设计的测试数据对代码进行测试,并对运行结果进行分析和总结。
模式匹配KMP算法研究报告

模式匹配的KMP算法研究学生姓名:黄飞指导老师:罗心摘要在计算机科学领域,串的模式匹配<以下简称为串匹配)算法一直都是研究焦点之一。
在拼写检查、语言翻译、数据压缩、搜索引擎、网络入侵检测、计算机病毒特征码匹配以及DNA序列匹配等应用中,都需要进行串匹配。
串匹配就是在主串中查找模式串的一个或所有出现。
在本文中主串表示为S=s1s2s3…sn,模式串表示为T=t1t2…tm。
串匹配从方式上可分为精确匹配、模糊匹配、并行匹配等,著名的匹配算法有BF算法、KMP算法、BM算法及一些改进算法。
本文主要在精确匹配方面对KMP算法进行了讨论并对它做一些改进以及利用改进的KMP来实现多次模式匹配。
关键字:模式匹配;主串;模式串;KMP算法Research and Analysis of KMP Pattern MatchingAlgorithmStudent:Huangfei Teacher:LuoxinAbstract In computer science,String pattern matching(Hereinafter referred to as the string matching>algorithmis always the focus of the study.In thespell check, language translation, data compression, search engine, thenetwork intrusion detection system, a computer virus signature matching DNAsequences and the application in the match,matched to string matching.String matching is in search of a string of pattern or all appear.In this paper, the string is S = s1s2s3... Sn, string pattern for T = t1t2... tm.String matching way can be divided from the accurate matching, fuzzy matching, parallel matching etc., the famous matching algorithms are KMP algorithm, BF algorithm, the algorithm and some BM algorithm.This paper in precise KMP algorithm for matching aspects are discussed and some improvement on it and using the improved KMP to realize the multiple pattern matching.Key words: pattern matching, The string。
模式匹配KMP算法实验报告

实验四:KMP算法实验报告一、问题描述模式匹配两个串。
二、设计思想这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KM P算法。
注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法:int Index(String S,String T,int pos)//参考《数据结构》中的程序{i=pos;j=1;//这里的串的第1个元素下标是1while(i<=S.Length && j<=T.Length){if(S[i]==T[j]){++i;++j;}else{i=i-j+2;j=1;}//**************(1)}if(j>T.Length) return i-T.Length;//匹配成功else return 0;}匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子:S:aaaaabababcaaa T:ababcaaaaabababcaaaababc.(.表示前一个已经失配)回溯的结果就是aaaaabababcaaaa.(babc)如果不回溯就是aaaaabababcaaaaba.bc这样就漏了一个可能匹配成功的情况aaaaabababcaaaababc这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。
如果T为a bcdef这样的,大没有回溯的必要。
改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。
如果不用回溯,那T串下一个位置从哪里开始呢?还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样:...ababd...ababc->ababc这样i不用回溯,j跳到前2个位置,继续匹配的过程,这就是KMP算法所在。
实验04:串应用KMP算法PPT课件

在生物信息学中的应用
在生物信息学中,KMP算法被广泛应用于基因序列的比对和拼接,以及蛋白质序列 的匹配和比对。
通过构建基因序列或蛋白质序列的索引表,KMP算法可以在O(n+m)的时间复杂度 内完成序列的比对和拼接,提高了比对和拼接的准确性和效率。
KMP算法在生物信息学中的应用有助于深入了解基因和蛋白质的结构和功能,为生 物医学研究和疾病诊断提供了有力支持。
06 实验总结与展望
KMP算法的优缺点
优点
高效:KMP算法在匹配失败时能跳过 尽可能多的字符,减少比较次数,从
而提高匹配效率。
适用范围广:KMP算法适用于各种模 式串匹配问题,不受模式串长度的限 制。
缺点
计算量大:KMP算法需要计算和存储 部分匹配表,对于较长的模式串,计 算量较大。
不适合处理大量数据:KMP算法在处 理大量数据时可能会占用较多内存, 导致性能下降。
匹配失败的处理
当模式串中的某个字符与主串中的对应字符不匹配时,模式串向右 滑动,与主串的下一个字符重新对齐,继续比较
next[ j]表示当模式串中第j个字符与主 串中的对应字符不匹配时,模式串需 要向右滑动的位置。
next数组的构建
next数组的作用
在匹配过程中,通过next数组可以快 速确定模式串需要滑动到哪个位置, 从而提高了匹配效率。
通过已知的next值,递推计算出next 数组中其他位置的值。
KMP算法的时间复杂度
01
02
03
04
时间复杂度分析
KMP算法的时间复杂度取决 于模式串在主串中出现的次数 以及每次匹配所花费的时间。
最佳情况
当模式串在主串中连续出现时 ,KMP算法的时间复杂度为
kmp算法实验报告

kmp算法实验报告篇一:模式匹配KMP算法实验报告实验四:KMP算法实验报告一、问题描述模式匹配两个串。
二、设计思想这种由,注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法:int Index(String S,String T,int pos)//参考《数据结构》中的程序 {i=pos;j=1;//这里的串的第1个元素下标是1while(i {if(S[i]==T[j]){++i;++j;}else{i=i-j+2;j=1;}//**************(1)}if(j>T.Length) return i-T.Length;//匹配成功else return 0;}匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子:S:aaaaabababcaaa T:ababcaaaaabababcaaaababc.(.表示前一个已经失配)回溯的结果就是aaaaabababcaaaa.(babc)如果不回溯就是aaaaabababcaaaaba.bc这样就漏了一个可能匹配成功的情况aaaaabababcaaaababc这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。
如果T为abcdef这样的,大没有回溯的必要。
改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。
如果不用回溯,那T串下一个位置从哪里开始呢?还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样:...ababd...ababc->ababc这样i不用回溯,j跳到前2个位置,继续匹配的过程,这就是KMP算法所在。
这个当T[j]失配后,j应该往前跳的值就是j的next值,它是由T串本身固有决定的,与S串无关。
《数据结构》上给了next值的定义:0如果j=1next[j]={Max{k|1 1其它情况其实它就是描述前面表述的情况,关于next[1]=0是规定的,这样规定可以使程序简单一些,如果非要定为其它的值只要不和后面的值冲突也是可以的;而那个Max是什么意思,举个例子:T:aaab...aaaab...aaab->aaab->aaab->aaab像这样的T,前面自身部分匹配的部分不止两个,那应该往前跳到第几个呢?最近的一个,也就是说尽可能的向右滑移最短的长度。
kmp算法生活例题

kmp算法生活例题KMP算法是一种用于解决字符串匹配问题的算法,可以在O(n+m)的时间复杂度内完成匹配操作,其中n为原始字符串长度,m为匹配字符串长度。
KMP算法的应用非常广泛,在生活中我们可以通过KMP算法来解决一些实际问题。
例如,在生活中我们经常需要查找一些字符串在一本书籍或者文件中的出现次数。
如果使用暴力匹配算法来解决这个问题,时间复杂度将会是O(n*m),其中n为书籍或文件的长度,m为要匹配的字符串长度。
如果书籍或文件非常大,将导致耗费大量时间。
而使用KMP算法,可以大大提高查找效率。
首先,我们需要对要匹配的字符串进行预处理,构建一个辅助数组next,用于记录每个字符的最长可匹配前缀的后缀长度。
然后,根据这个next数组,结合主串和模式串的指针进行匹配。
具体的过程如下:1. 预处理:根据要匹配的字符串生成辅助数组next。
假设要匹配的字符串为pattern,next数组的长度为m,i为当前字符的索引位置。
- 初始化next[0] = -1,next[1] = 0;-令j=0;-循环执行以下步骤,直到i等于m-1:- 如果j等于-1或者pattern[i]等于pattern[j],则令i和j分别加1;- 如果pattern[i]等于pattern[j],则next[i+1] = j+1;- 否则next[i+1] = next[j]+1;- 否则,令j = next[j];- 返回next数组。
2. 匹配:通过next数组对主串text和模式串pattern进行匹配。
- 初始化text和pattern的指针分别为i和j,令i = 0,j = 0;-循环执行以下步骤:- 如果j等于-1或者text[i]等于pattern[j],则令i和j分别加1;- 否则,令j = next[j];- 如果j等于m,表示匹配成功,更新匹配次数,并且令j =next[j];-返回匹配次数。
接下来,我们通过一个生活例题来说明KMP算法的应用。
KMP算法实验报告

}
六
第一步,对模式串中求next操作的逐一检查。
第二步:对KMP匹配算法进行逐一检查
七
八
j=next[j]; //消除了指针i的回溯
}
if(j==strlen(p))
return i+1-strlen(p);
}
return -1;
}
int main()
{
char s[100]="acabaabaabcacaabc";
char p[100]="baabcac";
printf("在第%d个元素时匹配成功\n",KMPMatch(s,p));
}
}
int KMPMatch(char *s,char *p)
{
int next[100];
int i,j;
i=0;
j=0;
getNext(p,next);
while(i<strlen(s))
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
printf("此时主串是第%d个元素,%c。模式串是第%d个元素,%c\n",i+1,s[i],j+1,p[j]);
#include <stdlib.h>
#include <conio.h>
#defineCHUNKSIZE 80
void getNext(char *p,int *next)
{
int j,k,x;
next[0]=-1;
计算机算法实验报告BF和KMP

天津市大学软件学院实验报告课程名称:串匹配算法实验姓名:***学号:**********班级:业务1114串匹配问题一、实验题目:给定一个主串,在该主串中查找并定位任意给定字符串。
二、实验目的:(1)深刻理解并掌握蛮力法的设计思想;(2)提高应用蛮力法设计算法的技能;(3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。
三、实验分析:串匹配问题的BF算法1 在串S中和串T中设比较的下标i=1和j=1;2 循环直到S中所剩字符个数小于T的长度或T中所有字符均比较完2.1 k=i2.2 如果S[i]=T[j],则比较S和T的下一字符,否则2.2 将i和j回溯(i=k+1; j=1)3 如果T中所有字符均比较完,则匹配成功,返回k否则匹配失败,返回0时间复杂度:设匹配成功发生在si处,则在i-1趟不成功的匹配中比较了(i-1)m次,第i趟成功匹配共比较了m次,所以总共比较了i m次,因此平均比较次数是:pi(i m)=(i m)=一般情况下,m<<n,因此最坏情况下时间复杂度是Ο(n m)。
串匹配问题的KMP算法实现过程:在串S和串T中高比较的起始下标i和j;循环直到S中所剩字符小于T的长度或T的所有字符均比较完(如果S[i]=T[j],则继续比较S和T的下一个字符;否则将j向右滑动到next[j]位置,即j=next[j];如果j=0,则将i和j分别+1,准备下趟比较,至于其中的next在此不作详细讲解);如果T中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回0。
时间复杂度:Ο(n m),当m<<n时,KMP算法的时间复杂性是Ο(n)。
四、实验所用语言和运行环境C++,运行环境Microsoft Visual C++ 6.0五、实验过程的原始记录BF算法程序代码#include<iostream.h>#include<string>void main(){cout<<"请输入主串并且以0和回车结束"<<endl;char s[100];char t[100];for(int m=0;m<100;m++){cin>>s[m];if(s[m]=='0'){s[m]='\0';break;}}cout<<"您输入的主串为:";for(int o=0;o<strlen(s);++o){cout<<s[o];}cout<<endl;cout<<"主串长度:";cout<<strlen(s);cout<<endl<<endl;cout<<"请输入子串并且以0和回车结束"<<endl;for(int n=0;n<100;n++){cin>>t[n];if(t[n]=='0'){t[n]='\0';break;}}cout<<"您输入的子串为:";for(int a=0;a<strlen(t);++a){cout<<t[a];}cout<<endl;cout<<"子串长度:";cout<<strlen(t);cout<<endl;cout<<endl<<"++++++++BF算法++++++++"<<endl;int i,j,k,y=0;for(i=0;i<strlen(s)-strlen(t)+1;){k=i;for(j=0;j<strlen(t);)if(s[i]==t[j]){if(j==strlen(t)-1){cout<<"找到了相同的字串:";cout<<"位置在主串的第"<<i-j+1<<"的位置上";cout<<endl;y=1;break;}++i;++j;}else{j=0;break;}}i=k+1;if(y==1)break;}if(i==strlen(s)-strlen(t)+1&&j!=strlen(t)-1){cout<<"没有找到可以匹配的子串"<<endl;}}程序执行结果:查找到了子串没有查找到子串程序代码#include<iostream.h>#include<string>//前缀函数值,用于KMP算法int GETNEXT(char t[],int b){int NEXT[10];NEXT[0]=-1;int j,k;j=0;k=-1;while(j<strlen(t)){if ((k==-1)||(t[j]==t[k])){j++;k++;NEXT[j]=k;}else k=NEXT[k];}b=NEXT[b];return b;}int KMP(char s[],char t[]){int a=0;int b=0;int m,n;m=strlen(s); //主串长度n=strlen(t); //子串长度cout<<endl<<"+++++++++KMP算法++++++++++++"<<endl;while(a<=m-n){while(s[a]==t[b]&&b!=n){a++;b++;}if(b==n){cout<<"找到了相应的子串位置在主串:"<<a-b+1<<endl;return 0;}b=GETNEXT(t,b);a=a-b;if(b==-1) b++;}cout<<"没有找到匹配的子串!"<<endl;return 0;}void main(){cout<<"请输入主串并且以0和回车结束"<<endl;char s[100];char t[100];for(int m=0;m<100;m++){cin>>s[m];if(s[m]=='0'){s[m]='\0';break;}}cout<<"您输入的主串为:";for(int o=0;o<strlen(s);++o){cout<<s[o];}cout<<endl;cout<<"主串长度:";cout<<strlen(s);cout<<endl<<endl;cout<<"请输入子串并且以0和回车结束"<<endl;for(int n=0;n<100;n++){cin>>t[n];if(t[n]=='0'){t[n]='\0';break;}}cout<<"您输入的子串为:";for(int a=0;a<strlen(t);++a){cout<<t[a];}cout<<endl;cout<<"子串长度:";cout<<strlen(t);cout<<endl;KMP(s,t);}程序执行结果:查找到子串没有查到子串。
kmp算法实验报告

数据结构实验报告学院软件学院年级2009级班级班学号姓名2010 年 3 月24 日目录一、实验内容 (1)二、实验过程 (X)三、实验结果 (X)一、实验内容:1、实验题目:KMP算法2、实验要求:实现教材中字串比较kmp算法,比较模式串abaabcac与主串acabaabaabcacaabc。
3、实验目标:了解并掌握串的类型定义和基本操作,并在此基础上实现kmp算法。
了解kmp算法的基本原理和next函数的使用。
二、实验过程:1、任务分配2、设计思想(1)KMP算法:在模式匹配中,每当一趟匹配过程出现字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右滑动尽可能远的一段距离之后,继续进行比较。
(2)next函数:看成一个模式匹配问题,整个模式串既是主串又是模式串,可仿照KMP算法。
3、需求分析(1) 输入的形式和输入值的范围:输入主串S,模式串T,位置pos(2) 输出的形式:模式串在主串中开始匹配的位置i(3) 程序所能达到的功能:利用kmp算法完成模式串和主串的模式匹配,并输出模式串在主串中开始匹配的位置(4) 测试数据:S=acabaabaabcacaabcT=abaabcacPos=64、概要设计1).抽象数据类型Class String()定义字符串Int StrLength()返回串的长度V oid get_next()求模式串T的next函数值并存入nextint kmp()利用模式串T的next函数求出T在主串S中第pos个字符之后的位置的KMP算法2).算法a.kmp算法模块:实现主串和模式串的模式匹配b.next函数模块:实现模式串自身的模式匹配,并存入nxet函数中c.接收处理命令(初始化数据)5、详细设计程序代码(含注释)6、调试分析(1)调试中的问题分析:a.(2)算法的时空分析:在利用简单的Index()函数进行模式匹配时,虽然易于理解,但是该算法效率很低。
数据结构实验报告——KMP算法

实验名称:Kmp 算法
实验人:
学号:
按要求完成的输入/输出信息 完成日期 自我评价
2.输入数据应提示输入内容与输入格式。 3. 输出数据要加以说明。 4.程序应注意使用注释语句。 5.注意程序的健壮性和交互性,养成良好的编程习惯。 6.在“网上课程”上提交 C 源程序。 7.交打印稿(或电子稿)的实验报告(完成日期:11 月 17 日) 。 三.实验内容:(提供每一个实验题目的算法描述、程序代码) 实验内容: 内容 [问题描述 问题描述] 问题描述 选做 1: 求出子串(模式串)的 next,利用 kmp 算法实验模式与主串的匹配算法。 要求:由键盘输入主串及子串的值, (1)输出子串的 next 值(注:next 的初始值为: next[1]=0)(2)输出子串在主串中首次出现的位置。 。 选做 2: 实现串的基本运算(求(1)串的长度、 (2)串的连接、 (3)串的比较) 。 要求: (1)由键盘输入一个串的值,输出串的长度。 (2)由键盘输入两个串的值,输出第一个串+第二个串的值。 (3)由键盘输入两个串的值,比较两串是否相等,输出相关提示信息。 [算法描述 算法描述] 算法描述 算法提示: 1.生成模式串的 next 函数 2.从第 1 个字符开始,进行模式串与主串的比较, 3.如果出现失配,将模式串的第 next[j]位置开始,继续与主串进行比较。
深 圳 大 学 实 验 报 告
课程名称: 课程名称:
数据结构
实验项目名称: 实验项目名称:
实验三: 实验三:Kmp 算法
ห้องสมุดไป่ตู้学院: 学院:
计算机与软件学院
专业: 专业:
计算机
指导教师: 指导教师:
蔡平
报告人: 报告人: 郑静宏
顺序表链表KMP实验报告

附件(四)深圳大学实验报告课程名称:数据结构实验与课程设计实验项目名称:顺序表、链表、堆栈队列、串KMP算法学院:专业:指导教师:报告人:学号:班级:实验时间:实验报告提交时间:教务处制第1行输出创建后的顺序表内容,包括顺序表实际长度和数据(完成)每成功执行一次操作(插入或删除),输出执行后的顺序表内容(完成)每成功执行一次查找,输出查找到的数据(完成)如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出顺序表内容(完成)2.Problem B: DS顺序表--连续操作目的:(1)建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)(2)实现连续多个插入,即从位置i开始插入多个数据(3)实现连续多个删除,即从位置i开始删除多个数据要求:Input第1行先输入n表示有n个数据,即n是实际长度;接着输入n个数据(完成)第2行先输入i表示插入开始的位置,再输入k表示有k个插入数据,接着输入k 个数据(完成)第3行先输入i表示删除开始的位置,再输入k表示要删除k个数据(完成)Output顺序表内容包括顺序表的实际长度和数据,数据之间用空格隔开(完成)第1行输出创建后的顺序表内容(完成)第2行输出执行连续插入后的顺序表内容(完成)第3行输出执行连续删除后的顺序表内容(完成)(3)操作包括:插入、删除、查找(4)注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据要求:Input第1行先输入n表示有n个数据,接着输入n个数据(完成)第2行输入要插入的位置和新数据(完成)第3行输入要插入的位置和新数据(完成)第4行输入要删除的位置(完成)第5行输入要删除的位置(完成)第6行输入要查找的位置(完成)第7行输入要查找的位置(完成)Output数据之间用空格隔开,(完成)第1行输出创建后的单链表的数据(完成)每成功执行一次操作(插入或删除),输出执行后的单链表数据(完成)每成功执行一次查找,输出查找到的数据(完成)如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出单链表(完成)2.Problem B: DS单链表--结点交换目的:(1)用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置。
KMP实验报告

KMP实验报告实验报告题⽬:编制字符串匹配的KMP算法班级:理科实验四班姓名:⽊三学号:****** 完成⽇期:2016.4.17⼀、需求分析1.字符串匹配试求⼦串位置的定位函数,普通的字符串匹配函数时间复杂度较⼤达到了O(m*n),⽽KMP算法则可以将时间复杂度简化到O(m+n)。
2.本演⽰程序中,字符串的元素为除换⾏、退格等字符外的其他字符,字符串长度<=MAXSIZE,字符串的输⼊的形式为string[0]储存长度,从string[1]开始存储字符,并以’\0’做结束标志,字符串中字符顺序不限,且允许出现重复字符,不能出现⾮法字符。
输⼊两个字符串后,输⼊⼀个整形数pos,pos<=MAXSIZE,pos的值必须合法。
输出的结果为⼀个整形数,表⽰,从第⼀个字符串的pos位置开始,之后的⼦串能否与第⼆个字符串匹配,若能,输出匹配⾸地址的编号,若不能,输出0。
3.程序执⾏的命令包括:1)构造字符串1;2)构造字符串2;3)kmp算法;4)得到next[];4.测试数据1)string1=’abababab’ string2=’aba’ pos=1 output=1;2)string1=’abababab’ string2=’aba’ pos=6 output=0;⼆、概要设计KMP算法是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的⼀种模式匹配的⾼效算法,,可以在O(m+n)的时间数量级上完成串的模式匹配操作。
其改进在于:每当⼀趟匹配过程中出现的字符⽐较不等时,不需要回溯i指针,⽽是利⽤已经得到的?部分匹配?的结果将模式向右?滑动?尽可能远的⼀段距离后,继续进⾏⽐较。
为实现上述上述程序功能,应以串的定长顺序存储表⽰来存放字符串,且需要串的抽象数据类型。
1.串的定长顺序存储表⽰为:#define MAXSTRLEN 255//⽤户可在255以内定义最⼤串长typedef char SString[MAXSTRLEN+1];//0号单元存放串的长度2.串的抽象数据类型定义为:ADT String{数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n,n>=0}数据关系:R1={|ai-1,ai∈D,i=1,2,...,n}基本操作:GetString(SString &S)初始条件:存在串的指针。
KMP算法的Java实现例子以及测试分析

KMP算法的Java实现例子以及测试分析背景简介:KMP算法用来处理字符串匹配的。
给你A,B两个字符串,检查B串是否是A串的子串,类似于Java的String.indexOf("")。
之所以叫做KMP,是因为这个算法是由Knuth、Morris、Pratt三个提出来的,取了这三个人的名字的头一个字母。
原理介绍:找到匹配失败时的最合适的回退位置,而不是简单的回退到子串的第一个字符(常规的枚举查找方式,是简单的回退到子串的第一个字符,接下来准备写一篇KMP算法的性能分析Java实现实例),即可提高查找的效率。
因此为了找到这个合适的位置,先对子串预处理,从而得到一个回退位置的数组。
过多的理论就不介绍了。
总体而言比较简单,KMP算一个经典的算法例子,很多笔试、面试也会问起。
现总结一下,放在这里供大家参考、交流,希望对大家有所帮助,下面直接给出实现例子,测试与分析也包含其中。
一、一个文件源代码KMP.java源代码为:package algorithm.kmp;/*** KMP算法的Java实现例子与测试、分析* @author 崔卫兵* @date 2009-3-25*/public class KMP {/*** 对子串加以预处理,从而找到匹配失败时子串回退的位置* 找到匹配失败时的最合适的回退位置,而不是回退到子串的第一个字符,即可提高查找的效率* 因此为了找到这个合适的位置,先对子串预处理,从而得到一个回退位置的数组* @param B,待查找子串的char数组* @return*/public static int[] preProcess(char [] B) {int size = B.length;int[] P = new int[size];P[0]=0;int j=0;//每循环一次,就会找到一个回退位置for(int i=1;i<size;i++){//当找到第一个匹配的字符时,即j>0时才会执行这个循环//或者说p2中的j++会在p1之前执行(限于第一次执行的条件下)//p1while(j>0 && B[j]!=B[i]){j=P[j];}//p2,由此可以看出,只有当子串中含有重复字符时,回退的位置才会被优化if(B[j]==B[i]){j++;}//找到一个回退位置j,把其放入P[i]中P[i]=j;}return P;}/*** KMP实现* @param parStr* @param subStr* @return*/public static void kmp(String parStr, String subStr) {int subSize = subStr.length();int parSize = parStr.length();char[] B = subStr.toCharArray();char[] A = parStr.toCharArray();int[] P = preProcess(B);int j=0;int k =0;for(int i=0;i<parSize;i++){//当找到第一个匹配的字符时,即j>0时才会执行这个循环//或者说p2中的j++会在p1之前执行(限于第一次执行的条件下)//p1while(j>0 && B[j]!=A[i]){//找到合适的回退位置j=P[j-1];}//p2 找到一个匹配的字符if(B[j]==A[i]){j++;}//输出匹配结果,并且让比较继续下去if(j==subSize){j=P[j-1];k++;System.out.printf("Find subString '%s' at %dn",subStr,i-subSize+1);}}System.out.printf("Totally found %d times for '%s'.nn",k,subStr);}public static void main(String[] args) {//回退位置数组为P[0, 0, 0, 0, 0, 0]kmp("abcdeg, abcdeh, abcdef!这个会匹配1次","abcdef");//回退位置数组为P[0, 0, 1, 2, 3, 4]kmp("Test ititi ititit! Test ititit!这个会匹配2次","ititit");//回退位置数组为P[0, 0, 0]kmp("测试汉字的匹配,崔卫兵。
kmp算法上机报告

1 问题部分1.1 问题描述(1)实现教材上的kmp算法,输入两个字符串a,b,输出b的特征向量以及b在a中匹配的结果,如果b不是a的子串,输出-1,否则输出第一次匹配成功的位置。
(2)Given two strings a and b we define a*b to be their concatenation.For example, if a = "abc" and b = "def" then a*b = "abcdef".If we think of concatenation as multiplication, exponentiationby a non-negative integer is defined in the normal way: a^0 ="" (the empty string) and a^(n+1) = a*(a^n).根据输入的字符串,寻找最短循环子串的出现频率。
1.2 问题分析第(1)题实际上就是考核对kmp算法的体会,通过计算特征数来判断最后每一位位移的最小位置。
进而最节省时间的解决问题。
第(2)题中也应用了kmp思想。
通过比较得出长度最短的循环串及其频率。
2 实现部分●算法具体描述第(1)题:运用递归的方法求出模板串b的特征数N,再依次输出,根据特征数N,利用kmp算法,进行合适的移位,使得复杂度最小。
再根据结果输出-1(主字符串a中不含模板b)或者输出第一次匹配成功的位置。
第(2)题:先求出字符串a的特征数n【】,先令循环串长度为1,通过比较,比较到a【i】(循环串的点)≠a【j】时,令新的循环传长度为j-n【j】,以此类推。
●算法的具体实现第(1)题:输入部分:先后输入字符串b(模板),字符串a(主字符串)。
函数next部分:求出模板b的每个b【i】的特征数N【i】,利用递归定义:从i=1开始,i++,在i<m的情况下进行循环(1)若b【i】=b【k】,则b【k】=N【k-1】+1;(2)若b【i】≠b【k】,令k=N【k-1】;函数kmp部分:对主字符串的第一个字符开始比较,如果a,b串对应位置是相等,就继续比较下去,若对应位置a【i】=b【j】,就i++,j++,继续比较;若对应位置不相等(a【i】≠b【j】),则从b【j】前一位的特征数的数值对应的位置(j=N【j-1】)继续与a【i】比较。
kmp算法生活例题

kmp算法生活例题KMP算法(Knuth-Morris-Pratt算法)是一种用于字符串匹配的高效算法。
它利用了匹配失败时,模式串中已经部分匹配的信息,避免反复回溯。
在我们的日常生活中也存在很多和字符串匹配相关的问题,下面我将通过几个例题来介绍KMP算法在生活中的应用。
1.字符串查找举个例子,假设我们需要在一首长诗中查找一些单词,如"KMP"。
我们可以使用KMP算法,将单词"KMP"进行预处理,得到部分匹配表,然后根据部分匹配表快速地在长诗中定位关键词。
2.自动补全在引擎、输入法等应用中,自动补全是一种很常见的功能。
用户输入一些关键词的前缀时,系统会自动提示后续可能的词语。
这就涉及到了字符串的匹配。
使用KMP算法,我们可以事先将所有可能的词语进行预处理,得到一个部分匹配表。
然后根据用户输入的前缀,可以快速地在部分匹配表中进行匹配,找出可能的词语,然后进行提示。
举个例子,当用户在引擎中输入"KMP"时,引擎会根据预处理得到的部分匹配表,快速地找到以"KMP"为前缀的可能词语,如"KMP算法"、"KMP字符串匹配"等,并进行提示。
3.字符串替换而使用KMP算法,我们可以预处理需要替换的字符串,并得到一个部分匹配表。
然后在文本中定位要替换的字符串,快速地进行替换操作。
举个例子,假设我们需要将一篇文章中的"KMP"替换为"字符串匹配算法"。
我们可以使用KMP算法,将"KMP"进行预处理,得到部分匹配表。
然后在文章中定位关键词"KMP",并进行替换操作。
综上所述,KMP算法在日常生活中有着广泛的应用。
不仅可以用于字符串查找、自动补全等功能,还可以用于字符串替换等操作。
KMP算法通过利用模式串中已经部分匹配的信息,避免了反复回溯,提高了字符串匹配的效率。
kmp算法测试用例

kmp算法测试用例KMP算法测试用例KMP算法是一种高效的字符串匹配算法,它能够在一个主串中快速查找一个模式串的位置。
在软件开发中,字符串匹配是一个非常常见的问题,如文本搜索、数据处理、编译器等都需要用到字符串匹配算法。
KMP算法以其高效的匹配速度和较低的时间复杂度成为了字符串匹配算法的首选之一。
一、KMP算法的原理KMP算法通过预处理模式串,构建一个部分匹配表(Partial Match Table),然后通过该表减少不必要的比较次数,提高算法的效率。
KMP算法的核心思想是,当在主串中匹配到某个字符与模式串不匹配时,通过部分匹配表找到一个可以跳过多个字符的位置,从而减少比较的次数。
二、KMP算法的实现KMP算法的实现分为两个步骤:预处理和匹配。
首先对模式串进行预处理,构建部分匹配表。
然后在主串中进行匹配,根据部分匹配表的结果决定移动的位置。
下面以一个测试用例来说明KMP算法的实现过程。
假设主串为:"ABABABABCABABABABCABABABABC",模式串为:"ABABABC"。
1. 预处理首先计算模式串的部分匹配表,该表用于存储模式串中每个前缀的最长相同前缀和后缀的长度。
例如,对于模式串"ABABABC",其部分匹配表为[0, 0, 1, 2, 3, 0, 1]。
2. 匹配在主串中按照KMP算法进行匹配。
首先将模式串与主串的第一个字符进行比较,发现不匹配,根据部分匹配表得到需要移动的位置。
由于模式串的第一个字符不匹配,根据部分匹配表的结果,移动的位置为3。
然后将模式串向右移动3位,与主串的第四个字符进行比较。
接下来的匹配过程如下:- 模式串与主串的第四个字符进行比较,发现不匹配,根据部分匹配表得到需要移动的位置为3。
将模式串向右移动3位,与主串的第七个字符进行比较。
- 模式串与主串的第七个字符进行比较,发现匹配,继续比较下一个字符。
BF算法和KMP算法程序

BF算法和KMP算法程序实验内容:比较BF算法和KMP算法的优劣实验基本要求:1.采用定长顺序显示表示串长的结构来存储串2.实现BF算法(即朴素算法),BF函数头如下int Index_BF(SString S, SString T) {}// 返回子串T在主串S中第0个字符之后的位置。
若不存在,返回-13.实现getnext函数和kmp算法函数,函数头分别如下:int Index_KMP(SString S, SString T){}//功能同Index_BFvoid get_next(SString T, int next[]){}4,编写主函数,分别定义SSsting类型的两个变量,并通过键盘输入串值,并为串设置串长,并分别验证两种匹配算法。
实验附加要求:1,修改以上的两种算法函数,使之可以统计字符的比较次数,并最终输出类似以下信息:主串长??,模式串长??BF算法,比较次数为??KMP算法,比较次数为??其中求next值比较的次数为??2,编写一个过滤函数函数头如下,将字符串中的所有指定子串删除,如果不存在指定子串,则函数返回0,否则返回删除的子串数。
并在主函数中进行测试。
int str_del(SString &S, SString T){}//删除S中的所有T子串,如S为”abcdabcdefa”,T为“abc”,则函数的返回为2,S变为“ddefa”3,编写一个替换函数,将字符串中的指定子串用另外一个子串进行替换,如果不存在指定子串,则函数返回0,否则返回替换的子串数。
并在主函数中进行测试。
int str_rep(SString &S, SString T, String P){}//将S中的所有T 子串替换为P,如S 为”abcdabcdefa”,T为“abc”,P为“dc”则函数的返回为2,S变为“dcddcdefa”实验提交要求:实验完成后,提交程序源文件(请务必以学号命名)和包含程序源文件及实验运行结果屏幕截图的word文档(也请务必以学号命名)。
kmp算法的实现

数据结构课程设计设计说明书模式匹配中的KMP算法的实现学生姓名学号班级成绩指导教师数据结构课程设计评阅书课程设计任务书2011 —2012 学年第二学期专业:学号:姓名:课程设计名称:数据结构设计题目:模式匹配中的KMP算法的实现完成期限:自2012 年 2 月20 日至2012 年3 月 2 日共 2 周设计依据、要求及主要内容(可另加附页):指导教师(签字):教研室主任(签字):批准日期:年月日摘要设计了一个模式匹配中的KMP算法的软件,该软件具有创建字符串、显示字符串以及子串定位的操作。
本软件采用VC++作为软件开发环境,采用C语言各种语句和结构实现模式匹配中的KMP算法的一系列操作,并采用友好界面向用户提示所操作过程和所输入数据方式,操作简单,界面清晰,易于为用户所接受。
关键字:主串;子串;模式匹配目录1 课题描述 (6)2 需求分析 (7)3 概要设计 (8)4 详细设计 (12)5 程序编码 (15)6结果分析 (19)7 总结 (24)参考文献 (25)1 课题描述本次实验重在设计模式匹配中的KMP算法的实现,通过c语言作为编程语言,实现模式匹配中的KMP算法,其中包括创建字符串、显示字符串以及子串定位。
先输入一个主串S(长度为m),然后再输入一个模式串T(长度为n),并且m>=n,求出T在S中模式匹配的第一个位置,并显示出计算过程中的关键参量及计算结果。
旨在使用户在使用过程中能学会直接调用各种所需函数,以及掌握对模式匹配中的KMP算法的各种操作。
开发工具:c语言运行环境。
2 需求分析在字符串的匹配过程中,从模式串和主串的第一个字符开始比较,如果匹配的话就比较他们的第二位,第三位……以此类推。
如果比较的过程中主串S的第i位和模式串T的第j位不匹配,说明匹配不成功,则将模式串T向后移动,在这个时候,由于前i-1和j-1是匹配的,所以可以导出如果此时T中的前k个字符T1,和Tj以前的k个字符Tj-1,Tj-2...Tj-k+1相同,这时就直接把模式串T向前移动j-k位,这时T的当前比较位j 就变成了next[j]了,循环执行(KMP算法)。
PythonKMP算法的实现

PythonKMP算法的实现引言每一本《数据结构》方面的书应该都会讲KMP算法,KMP算法可以说是知名度非常高的算法之一,为什么会叫做KMP算法?是因为KMP是由三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt几乎同时发现的。
所以取了每个人的第一个字母叫做KMP算法。
问题描述给你一个母串和一个子串;请在母串中寻找子串如果母串中存在子串则返回True,不存在则返回False。
示例:母串:ababababcabc,子串:abababca输入:ababababcabcabababca输出:True解决方案如KMP算法的时间复杂度为O(m+n)比暴力破解的时间复杂度O(m*n)小很多,这是因为在KMP算法中子串和母串不匹配的时候不会将子串向右挪移1位,而是将子串向后挪移k位。
如何确定子串向后挪移的位数呢?这个就像需要建立next数组来进行匹配,next数组就是子串中每一个位置的最大公共长度。
最大公共长度在算法导论里面就被记为next数组。
计算next数组就是计算子串中每一个位置的最大公共长度。
简单来说可以理解为遮住这个元素,去查看这个元素前面的相同前缀和后缀的长度,这个长度就是该元素对应的值,如图。
确定next数组后我们就可以开始子串与母串的匹配,当匹配到的元素值不同时,查找子串中该元素对应的next值,根据next值来确定子串该如何移动,移动后再开始新一次的匹配,一直循环这个过程直到匹配结束。
结语KMP算法的核心就是在于next数组的建立,建立正确的next数组至关重要,通过next数组里面的next值可以帮助我们有效的减少循环次数和节约大量的时间。
实习编辑:李欣容作者:***稿件来源:深度学习与文旅应用实验室(DLETA)。
模式匹配中的KMP算法的实现

模式匹配中的KMP算法的实现KMP算法(Knuth-Morris-Pratt算法)是一种用于字符串匹配的快速算法,通过有效利用已匹配部分的信息来跳过一些不必要的比较,从而提高匹配效率。
KMP算法是由Donald Knuth、Vaughan Pratt和JamesH.Morris于1977年提出的。
KMP算法的核心思想是利用"部分匹配表"来确定当模式串与主串不匹配时,模式串应该向后滑动的位置。
部分匹配表是模式串的前缀子串中的最长的可匹配的真前缀和后缀的长度。
下面是KMP算法的实现过程:1.首先,根据模式串生成部分匹配表。
部分匹配表中第i个位置的值表示模式串的前i个字符组成的子串的最长可匹配的真前缀和后缀的长度。
2.利用部分匹配表进行匹配。
在匹配过程中,用两个指针i和j分别表示主串和模式串的位置。
如果当前字符匹配成功,则i和j都向后移动一位;如果当前字符不匹配,则根据部分匹配表确定模式串应该向后滑动的位置。
下面是KMP算法的Python实现:```pythondef generate_next(pattern):next = [0] * len(pattern)next[0] = -1i,j=0,-1while i < len(pattern) - 1:if j == -1 or pattern[i] == pattern[j]: i+=1j+=1next[i] = jelse:j = next[j]return nextdef kmp_search(text, pattern):next = generate_next(pattern)i,j=0,0while i < len(text) and j < len(pattern): if j == -1 or text[i] == pattern[j]:i+=1j+=1else:j = next[j]if j == len(pattern):return i - jelse:return -1```在上述代码中,`generate_next`函数用于生成部分匹配表,`kmp_search`函数用于进行匹配。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else
next[i]=next[j];
j=next[i];
}
}
}
//输出实际运算次数
void display()
{
int i=0,j=0,v;
int count=0;
while(i<s.length()&&j<p.length())
{
if(s.charAt(i)==p.charAt(j))
实现KMP算法
#include <stdio.h>
#include <string.h>
#define MAXTRLEN 255
typedef unsigned char SString[MAXTRLEN+1];
void StrAssign(SString &T,char *s);
int Index_KMP(SString s,SString T,int pos);
{
i++;j++;
}
else if(j==0)i++;
else j=next[j];
count++;
}
System.out.println(""+count);
}
public static void main(String[] args) {
// TODO code application logic here
如果不用回溯,那T串下一个位置从哪里开始呢?
还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样:
...ababd...
ababc
->ababc
这样i不用回溯,j跳到前2个位置,继续匹配的过程,这就是KMP算法所在。这个当T[j]失配后,j应该往前跳的值就是j的next值,它是由T串本身固有决定的,与S串无关。
void get_next(String T,int &next[])
{
i=1;j=0;next[1]=0;
while(i<=T.Length)
{
if(j==0 || T[i]==T[j]){++i;++j; next[i]=j;/**********(2)*/}
else j=next[j];
}
}
看这个函数非常像KMP匹配的函数!注意到(2)语句逻辑覆盖的时候是T[i]==T[j]以及i前面的、j前面的都匹配的情况下,于是先自增,然后记下来next[i]=j,这样每当i有自增就会求得一个next[i],而j一定会小于等于i,于是对于已经求出来的next,可以继续求后面的next,而next[1]=0是已知,所以整个就这样递推的求出来了,方法非常巧妙。
T:aaab
...aaaab...
aaab
->aaab
->aaab
->aaab
像这样的T,前面自身部分匹配的部分不止两个,那应该往前跳到第几个呢?最近的一个,也就是说尽可能的向右滑移最短的长度。
到这里,就实现了KMP的大部分内容,然后关键的问题是如何求next值?先看如何用它来进行匹配操作。
将最前面的程序改写成:
int Index_KMP(String S,String T,int pos)
{
i=pos;j=1;//这里的串的第1个元素下标是1
while(i<=S.Length && j<=T.Length)
{
if(j==0 || S[i]==T[j]){++i;++j;} //注意到这里的j==0,和++j的作用就知道为什么规定next[1]=0的好处了
}
if(j>T.Length) return i-T.Length;//匹配成功
else return 0;
}
匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子:
S:aaaaabababcaaa T:ababc
aaaaabababcaaa
ababc.(.表示前一个已经失配)
入
侵
检
测
试
验
实验名称:_ KMP算法实验
专业班级:_网络工程13-01
学号:_
姓名:
一、问题描述
模式匹配两个串。
二、设计思想
这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。
注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法:
这样的改进已经是很不错了,但算法还可以改进,注意到下面的匹配情况:
...aaac...
aaaa.
T串中的'a'和S串中的'c'失配,而'a'的next值指的还是'a',那同样的比较还是会失配,而这样的比较是多余的,如果我事先知道,当T[i]==T[j],那next[i]就设为next[j],在求next值的时候就已经比较了,这样就可以去掉这样的多余的比较。于是稍加改进得到:
}
else j=next[j];
}
}
三、分析理论时间复杂性
这个程序或许比想像中的要简单,因为对于i值的不断增加,代码用的是for循环。因此,这个代码可以这样形象地理解:扫描字符串S,并更新可以匹配到T的什么位置。
为什么这个程序是O(n)的?KMP的时间复杂度分析可谓摊还分析的典型。我们从上述程序的j值入手。每一次执行while循环都会使j减小(但不能减成负的),而另外的改变j值的地方只有第五行。每次执行了这一行,j都只能加1;因此,整个过程中j最多加了n个1。于是,j最多只有n次减小的机会(j值减小的次数当然不能超过n,因为j永远是非负整数)。这告诉我们,while循环总共最多执行了n次。按照摊还分析的说法,平摊到每次for循环后,一次for循环的复杂度为O(1)。整个过程显然是O(n)的。这样的分析对于后面P数组预处理的过程同样有效,同样可以得到预处理过程的复杂度为O(m)。
{
int n,i;
n=strlen(s);
T[0]=n;
for(i=0;i<n;i++)
T[i+1]=s[i];
}
算法结果:
四、原程序和调试结果
package kmp;
public class kmp {
String s="aaaaaaaa";
String p="aaaab";
int[] next=new int[s.length()];
printf("请输入模式串\n");
gets(s);
StrAssign(T,s);
n=Index_KMP(T,S,1);
if(n)
{
printf("T是S的字串,位置为%d\n",n);
}else
{
printf("T不是S的字串\n");
}
}
int Index_KMP(SString S,SString T,int pos)
《数据结构》上给了next值的定义:
0如果j=1
next[j]={Max{k|1<k<j且'p1...pk-1'='pj-k+1...pj-1'
1其它情况
其实它就是描述前面表述的情况,关于next[1]=0是规定的,这样规定可以使程序简单一些,如果非要定为其它的值只要不和后面的值冲突也是可以的;而那个Max是什么意思,举个例子:
回溯的结果就是
aaaaabababcaaa
a.(babc)
如果不回溯就是
aaaaabababcaaa
aba.bc
这样就漏了一个可能匹配成功的情况
aaaaabababcaaa
ababc
这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为abcdef这样的,大没有回溯的必要。
改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。
//主要计算next[]的值
void calnext()
{
int i,j=0;
next[1] = 0;
next[0]=-1;
for(i=2;i<s.length();i++)
{
if(s.charAt(j)==s.charAt(i-1))
{
next[i]=next[i-1]+1;j++;
}
else
{
if(next[j]<0)
else j=next[j];//i不变(不回溯),j跳动
}
if(j>T.Length) return i-T.Length;//匹配成功
else return 0;
}
求next值,这也是整个算法成功的关键。前面说过了,next值表达的就是T串的自身部分匹配的性质,那么,我只要将T串和T串自身来一次匹配就可以求出来了,这里的匹配过程不是从头一个一个匹配,而是从T[1]和T[2]开始匹配,给出算法如下:
{
int i,j;
int next[10];
i=pos;
j=1;
get_next(T,next);
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])