字符串-模式匹配
给定主串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 <iostream>
using namespace std;
int BF(char S[ ], char T[ ]);
int main( )
{
char s1[100], s2[10];
int index = 0;
cout << "请输入主串:";
cin >> s1;
cout << "请输入模式串:";
cin >> s2;
index = BF(s1, s2);
if (index == -1)
cout << s2 << "不是" << s1 << "的子串" << endl;
else
cout << s2 << "在" << s1 << "的位置是: " << index << endl;
return 0;
}
int BF(char S[ ], char T[ ])
{
int start = 0; /*主串从下标0开始第一趟匹配*/
int i = 0, j = 0; /*设置比较的起始下标*/
while ((S[i] != '\0') && (T[j] != '\0'))
{
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数组定义如下