#pragma once
#include<iostream>
#include<vector>
using namespace std;
class Match {
private:
string main_str;
string pattern_str;
vector<int> next_vec;
public:
Match() {
this->main_str = "";
this->pattern_str = "";
}
Match(string _main_str, string _pattern_str) {
this->main_str = _main_str;
this->pattern_str = _pattern_str;
generate_next();
}
~Match() {};
string get_main() { return this->main_str; }
string get_pattern() { return this->pattern_str; }
vector<int> get_vec(){ return this->next_vec; }
void generate_next();
void start_match();
void optimization_vec();
};
// 判断字符串前后judge_len长度的元素是否相等
bool judge(string str, int judge_len) {
int len = str.size();
for (int i = 0; i < judge_len; i++) {
if (str[i] != str[len - judge_len + i]) {
return false;
}
}
return true;
}
// 生成next数组中的一个元素
int generate_public_num(string str) {
int len = str.size();
int res = 0;
for (int i = 0; i < len - 1; i++) {
if (judge(str, i)) {
res = i;
}
}
return res;
}
// 生成next数组
void Match::generate_next() {
int length = this->pattern_str.size();
string temp = "";
for (int i = 0; i < length; i++) {
temp += this->pattern_str[i];
this->next_vec.push_back(generate_public_num(temp));
}
}
// 优化next数组
void Match::optimization_vec() {
int len = this->pattern_str.size();
if (this->next_vec.size() != len) {
cout << "请输入正确主串和模式串" << endl;
return;
}
for (int i = 1; i < len; i++) {
if (this->pattern_str[this->next_vec[i]] == this->pattern_str[i]) {
this->next_vec[i] = this->next_vec[this->next_vec[i]];
}
}
}
// 开始匹配
void Match::start_match() {
int main_len = this->main_str.size();
int pattern_len = this->pattern_str.size();
if (main_len < pattern_len || main_len == 0 || pattern_len == 0) {
cout << "请输入正确主串和模式串" << endl;
return;
}
int i = 0, j = 0;
while (i < main_len) {
if (this->main_str[i] == this->pattern_str[j]) {
i++;
j++;
if (j == pattern_len) {
// size从1开始,j从0开始,最后匹配完后j还加了一次
cout << "匹配成功" << endl;
cout << "子串位置为:" << i - pattern_len + 1 << endl;
return;
}
}
else {
if (j == 0) {
i++;
}
else {
j = this->next_vec[j - 1];
}
}
}
cout << "匹配失败" << endl;
}
#include "KMP.h"
int main() {
string main_str = "hasdfhafgaert3thsdaerssddfhaert3ttertrt3t";
string pattern_str = "haert3t";
Match match = Match(main_str, pattern_str);
match.optimization_vec();
match.start_match();
}