串匹配问题
1.BF算法
#include<iostream>
using namespace std;
void BF(char* S, char* T) {
int loc = -1;//记录T串在S中的位置
int index = 0;//记录主串的比较位置
int i = 0, j = 0;//记录S和T当前的比较位置
while (S[i] != '\0' && T[j] != '\0') {//比较终止条件
if (S[i] == T[j]) {//相等则继续往下
i++;
j++;
}
else {//不相等,主串回到比较位置的下一个,子串回到0
index++;
i = index;
j = 0;
}
}
if (T[j] == '\0') {//匹配成功则更新位置
loc=index + 1;
}
if (loc == -1) {
cout << "主串中不含有子串" << endl;
}
else {
cout << "子串在主串中的位置为 " << loc << endl;
}
}
int main() {
char a[15];
char b[10];
cout << "请输入主串" << endl;
cin >> a;
cout << "请输入子串" << endl;
cin >> b;
BF(a, b);
return 0;
}
2.KMP算法
#include<iostream>
#include<string>
using namespace std;
void getNext(char *s, int *next)
{
int len = strlen(s);//记录比较长度
next[0] = -1;//初始置-1
for (int i = 1, k = 0; i < len; i++)//依次求相同的最大前缀和后缀
{
while (k > 0 && s[k] != s[i])
k = next[k - 1];
if (s[k] == s[i])
k++;
next[i] = k;
}
}
void kmp(char* S, char* T)
{
int i = 0, j = 0;
int loc = -1;//记录位置
int next[10];
getNext(T, next);
while (S[i] != '\0' && T[j] != '\0') {//和BM相同
if (S[i] == T[j]) {
i++;
j++;
}
else {//如果不相等则回溯
j = next[j];
if (j == -1) {
i++;
j++;
}
}
}
if (T[j] == '\0') {//匹配成功
loc = i - strlen(T) + 1;
}
if (loc != -1) {//返回对应信息
cout << "子串位于主串的第 " << loc << endl;
}
else {
cout << "主串不含有子串" << endl;
}
}
int main()
{
char S[15];
char T[10];
cout << "请输入串S" << endl;
cin >> S;
cout << "请输入串T" << endl;
cin >> T;
kmp(S, T);
}