第1关:实现朴素的字符串匹配
示例输入: string tri示例输出: Location: 1
从intfindsubstr(char*t,char* p )/*字符串t中搜索子字符串p。 如果字符串以数值结束,例如p=’str ‘,则p[0]=’s ‘,p[1]=’t ‘,p[2]=’r ‘,p[3]=0。 采用朴素的匹配算法。 返回子字符串第一次出现的位置。 例如,如果t=’string ring ‘,p=’ring ‘,则返回2。 如果找不到,则返回-1。 *//请在此处添加代码,以补充函数find substr/* * * * * * * * * begin * * * * * * * */intm=-1; int i=0; while(t(I ) if ) t ) I )==p )0) ) m=I; 布雷克; (I; }返回m; /******end***********/}但是,使用for循环会得到什么结果?
for(intI=0; Isizeof(t ); I )…) http://www.Sina.com/
next[i]在从左向右匹配p字符和t字符时,如果在p的第I位置存在不一致,则使字符串p相对于t向右移位i-next[i]位; 如果next[i]==0,则向右移动,对照位置从第j个位置开始,否则从第j 1个位置开始
voidkmpgennext(char*p,int* next ) /生成p的next数组,next数组的长度请在字符串p以上的长度中加上1 )//。 补充函数kmpgennext/* * * * begin while (p [ I ] ) if ) p[I]==p[0] ) {next[i]=-1; } else{next[i]=0; (I; 从(/() )、end (,int )、next )、int )、next )/t中查找子字符串p的第一个出现位置的while(p[I]!=0 t[j]!=0)//如果两个字符数组的扫描没有结束,if(p[I]==t[j] ) /字符匹配,则两个数组指针的位置向后移动I; j; }如果}elseif(next[i]==0) (/字符不匹配且next[I]==0)不匹配,则短数组所在位置的元素不是p[0] ) i=0; //短数组指针指向0,继续与长数组t[j]进行比较}else { //字符不匹配,且next[i]==-1 (如果不匹配,则短数组所在位置的元素为p[0] ) i=0 //短数组=p[0](j; }if(p[I]==0)返回j-I; //found //元素的下标从0开始时,为j-i; 元素下标从1开始时,返回j-i 1; else返回- 1; //not found}注意:如果元素下标从0开始,则为j-i; 元素下标从1开始时,返回j-i 1;