数据结构

您所在的位置:网站首页 输入两个字符串s和t 数据结构

数据结构

#数据结构| 来源: 网络整理| 查看: 265

字符串-模式匹配 给定主串S="s1s2…sn"和模式T=“t1t2…tm”,在S中寻找T 的过程称为模式匹配。 BF算法 给定主串S="s1s2…sn"和模式T=“t1t2…tm”, 在S中寻找T 的过程称为模式匹配。 如果匹配成功,返回T 在S中的位置,如果匹配失败,返回-1。 BF算法

在串 S 和串 T 中设比较的起始下标 i 和 j;

循环直到 S 或 T 的所有字符均比较完

2.1 如果S[i] 等于T[j],继续比较 S 和 T 的下一个字符; 2.2 否则,将 i 和 j 回溯,准备下一趟比较;

如果T中所有字符均比较完,则返回匹配的起始比较下标;否则如果匹配不成功,则返回 -1;

//模式匹配BF算法 #include using namespace std; int BF(char S[ ], char T[ ]); int main( ) { char s1[100], s2[10]; int index = 0; cout s1; cout s2; index = BF(s1, s2); if (index == -1) cout if (S[i] == T[j]) { i++; j++; } else { start++; i = start; j = 0; } /*i和j分别回溯*/ } if (T[j] == '\0') return start + 1; /*返回本趟匹配的起始位置*/ else return -1; }

KMP算法 1.在串S和串T中分别设比较的起始下标i和j; 2. 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较完毕

2.1 如果S[i]==T[j],继续比较S和T的下一个字符;否则 2.2 将j向右滑动到next[j]位置,即j=next[j]; 2.3 如果j=-1,则将i和j分别加1,准备下一趟比较; 如果T中所有字符均比较完毕,则返回匹配的起始下标;否则返回-1; //next数组生成 void Compute_Next(char t[], int next[]) { int j,k; next[0]=-1; j=1; while(t[j]!='\0') { k=next[j-1]; while((k!=-1)&&(t[k]!=t[j-1])) k=next[k]; next[j]=++k; j++; } } //KMP算法 int KMP_FindPat(char *s, char *t,int *next){ int i=0,j=0,k; while(s[i]!='\0' && t[j]!='\0') { if(j==-1 || s[i]==t[j]) { i++; j++; } else j=next[j]; } if(t[j]=='\0') return i-j; else return -1; }

通过t的next数组,来确定t相对于s的后移位数来减少比对次数。 next数组定义如下 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3