lxy_CH4_2anull第四章 串第四章 串串类型的定义
串的表示和实现
串的模式匹配算法4.3 串的模式匹配子串的定位操作
int Index( S, T, pos)
称为串的模式匹配4.3 串的模式匹配Index操作的实现1Index操作的实现1int Index(String S, String T, int pos){
SposTmnIndex操作的实现1Index操作的实现1int Index(String S, String T, int pos){
STposnmi=posmSubIndex操作的实现1In...
null第四章 串第四章 串串类型的定义
串的
示和实现
串的模式匹配算法4.3 串的模式匹配子串的定位操作
int Index( S, T, pos)
称为串的模式匹配4.3 串的模式匹配Index操作的实现1Index操作的实现1int Index(String S, String T, int pos){
SposTmnIndex操作的实现1Index操作的实现1int Index(String S, String T, int pos){
STposnmi=posmSubIndex操作的实现1Index操作的实现1int Index(String S, String T, int pos){
STposnmi=pos+1mSubIndex操作的实现1Index操作的实现1int Index(String S, String T, int pos){
STposnmi=pos+2mSubIndex操作的实现1Index操作的实现1int Index(String S, String T, int pos){
STposnmi=n-m+1pos<=i
0){
n=StrLength(S); m=StrLength(T); i=pos;
while(i<=n-m+1){
SubString(sub,S,i,m);
if(StrCompare(sub,T)!=0) ++i;
else return i; //返回子串在主串中的位置
}//while
}//if
return 0; // S中不存在与T相等的子串
}//IndexIndex操作的实现1int Index(String S, String T, int pos){
nullababcabcacbababcaci=1j=11nullababcabcacbababcaci=2j=21nullababcabcacbababcaci=3j=31nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=3j=13nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=4j=23nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53ababcabcacbababci=4j=14nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53ababcabcacbababci=4j=14ababcabcacbababcaci=5j=15nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53ababcabcacbababci=4j=14ababcabcacbababcaci=5j=15ababcabcacbababcaci=6j=16nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53ababcabcacbababci=4j=14ababcabcacbababcaci=5j=15ababcabcacbababcaci=6j=16nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53ababcabcacbababci=4j=14ababcabcacbababcaci=5j=15ababcabcacbababcaci=11j=66Index操作的实现2Index操作的实现2int Index(String S, String T, int pos){
STposnmi=n-m+1pos<=i=1&&pos<=S[0]){
k=i=pos; j=1; //i正文试配起点,j:模式指针,k:正文指针
last=S[0]-T[0]+1; //last:正文最后一个起点
while(k<=last && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=++k; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i;
else return 0;
}
else return 0;
}null模式匹配的一般过程i=i-j+2, j=1s1 s2 si-j+1 si-j+2 Si-1 si snp1 p2 pj-1 pj某次匹配Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}Brute-Force算法“蛮力”算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=1j=1ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=1j=1ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=1j=1ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=2ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=2ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=2ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=3ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=3ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=3ST第 1 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=3ST第 1 趟SBrute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=1ST第 2 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=1ST第 2 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=1ST第 2 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=1ST第 2 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=1ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=1ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=3j=1ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=2j=1ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=7j=5ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=7j=5ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=7j=5ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=7j=5ST第 3 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=4j=1ST第 4 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=5j=1ST第 5 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=6j=1ST第 6 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=6j=1ST第 6 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=6j=1ST第 6 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=7j=2ST第 6 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=10j=5ST第 6 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=11j=6ST第 6 趟Brute-Force算法Brute-Force算法 int Index(SString S,SString T,int pos){
if(pos>=1&&pos<=S[0]){
i=pos; j=1;
while(i<=S[0] && j<=T[0])
if(S[i]==T[j]) {++i; ++j; } // 继续比较后继字符
else{ i=i-j+2; j=1; } //指针后退重新开始匹配
if(j>T[0]) return i-T[0];
else return 0;
}
else return 0;
}i=11j=6ST第 6 趟Brute-Force算法null1s1 s2 si sm Sm+1 sn-m+1 sn-m+1 snp1 p2 pi pmnull12s1 s2 si sm Sm+1 sn-m+1 sn-m+1 snp1 p2 pi pms1 s2 si sm Sm+1 sn-m+1 sn-m+1 snp1 p2 pi pmnull12s1 s2 si sm Sm+1 sn-m+1 sn-m+1 snp1 p2 pi pms1 s2 si sm Sm+1 sn-m+1 sn-m+1 snp1 p2 pi pms1 s2 si sm Sm+1 sn-m+1 sn-m+1 snp1 p2 pi pmn-mO(m(n-m+1)) O(mn)nulls=“aaaa aa”t=“aa ab”nm每次比较字符数:m总共匹配次数:n-m+1O(m(n-m+1)) O(mn)最坏情况4.3.2 KMP算法4.3.2 KMP算法 1970年,S.A.Cook证明可用O(m+n)时间求解模式匹配问题
克努特(D.E.Knuth)和普拉特(V.R.Pratt)根据Cook的证明,构造出O(m+n)时间的模式匹配算法
同时,莫里斯(J.H.Morris)也出性能相似的算法当发现失配(sipj)时,正文指针i不回退,只让模式指针j回退,但不一定退回到1nullababcabcacbababcaci=3j=31ababcabcacbababcaci=2j=12ababcabcacbababcaci=7j=53ababcabcacbababci=4j=14ababcabcacbababcaci=5j=15ababcabcacbababcaci=11j=66nullababcabcacbababcaci=3j=31s1=p1s2=p2p1p2p1s2nullababcabcacbababcaci=3j=31ababcabcacbababcac2i=3j=1s1=p1s2=p2p1p2p1s2nullababcabcacbababcaci=3j=31ababcabcacbababcaci=7j=52si=pj (i=3~6, j=1~4)p1=p4s1=p1s2=p2p1p2p1s2nullababcabcacbababcaci=3j=31ababcabcacbababcaci=7j=52ababcabcacbababcaci=7j=23s1=p1s2=p2p1p2p1s2si=pj (i=3~6, j=1~4)p1=p4nullababcabcacbababcaci=3j=31ababcabcacbababcaci=7j=52ababcabcacbababcaci=11j=63si=pj (i=3~6, j=1~4)p1=p4s1=p1s2=p2p1p2p1s2nulls1 s2 si-j+1 si-j+2 Si-1 si snp1 p2 pj-1 pj(1) 模式串前j-1个字符全不相同p1 p2 pj-2 pj-1 (pjsi) 某次匹配p1 si-j+1, , p1 si-1null p1 pj-1 = si-j+1 si-1 (pjsi) (匹配结果)p1 pk-1 = pj-k+1 pj-1 (kT[0]) return i-T[0]; // 匹配成功
else return 0;
}KMP模式匹配算法nullnext[j]函数的计算设next[j]=knext[1]=0(1) 若pk=pjnext[j+1]=k+1=next[j]+1null(2) 若pkpj设next[k]=k’ (0
本文档为【lxy_CH4_2a】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。