算法步骤:
- 利用计数指针i和j指向主串S和模式串T中当前正待比较的字符位置,i初始为pos,j初始为1。
- 两个串未比较到串尾,执行循环操作:
- s.ch[i]和t.ch[i]比较,若相等,则i和j分别指示串中下一个位置,继续比较后续字符。
- 若不等,指针后退重新开始匹配。
- 如果j>t.length,说明模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则匹配成功,返回和模式t中第一个字符相等在主串中的序号;否则匹配不成功,返回0。
#include <iostream>
#include <cstring>
using namespace std;
#define MAXLEN 255
typedef struct {
char ch[MAXLEN+1]; // 0号位置不存储字符
int length;
}SString;
bool initSString(SString &s, char *str) {
int len = strlen(str);
for (int i = 0; i < len; ++i) {
s.ch[i+1] = str[i];
}
s.length = len;
return true;
}
int indexBF(SString s, SString t, int pos) {
// 计数指针i和j指向主串S和模式T当前正待比较的字符位置
int i = pos;
int j = 1;
while (i <= s.length && j <= t.length) {
if (s.ch[i] == t.ch[j]) { // 继续比较后继字符
i++;
j++;
} else { // 指针后退重新开始匹配
i = i-j+2;
j = 1;
}
}
if (j > t.length) { // 匹配成功
return i - t.length;
} else {
return 0;
}
}
int main() {
SString s, t;
char str[MAXLEN];
cin >> str;
initSString(s, str);
cin >> str;
initSString(t, str);
int ans = indexBF(s, t, 1);
if (ans) {
cout << "匹配的位置是 : " << ans << endl;
}
return 0;
}