KMP算法实现
(1)查到即退出
#include <iostream>
using namespace std;
#include<string>
void getmax(const string& str, string& a, int& m_next, int sonPos = 0) {
int index = 0;
int flag = 0;
int len = a.length();
int leng = str.length();
while (m_next < leng) {
for (int i = 0; i < len;)
{
if (str[m_next] == a[sonPos]) {
i++;
m_next++;
sonPos++;
flag = 1;
}
else {
index = sonPos;
flag = 0;
break;
}
}
if (flag == 1) {
cout << "有" << endl;
cout<<"第"<< m_next - a.length()+1<<"个字符(包括)开始,长度为"<< a.length() <<endl;
return;
}
int max = 0;
for (int i = 1; i < index;)
{
if (a.substr(0, index - i) == a.substr(i , index - i))
{
max = index - i;
break;
}
else {
i++;
}
}
max == 0 && sonPos == 0 ? m_next++ : m_next;
sonPos = max;
}
if (flag == 0) {
cout << "无" << endl;
}
}
int main() {
string str, a;
cout << "输入主串" << endl;
cin >> str;
cout << "输入子串" << endl;
cin >> a;
int next = 0;
getmax(str, a, next);
system("pause");
return 0;
}
(2)遍历完才退出
#include <iostream>
using namespace std;
#include<string>
void getmax(const string& str, string& a, int& m_next, int sonPos = 0) {
int index = 0;
int flag = 0;
int len = a.length();
int leng = str.length();
while (m_next < leng) {
for (int i = 0; i < len;)
{
if (str[m_next] == a[sonPos]) {
i++;
m_next++;
sonPos++;
flag = 1;
}
else {
index = sonPos;
flag = 0;
break;
}
}
if (flag == 1) {
sonPos -= a.length();
cout << "有" << endl;
cout<<"第"<< m_next - a.length()+1<<"个字符(包括)开始,长度为"<< a.length() <<endl;
}else {
int max = 0;
for (int i = 1; i < index;)
{
if (a.substr(0, index - i) == a.substr(i, index - i))
{
max = index - i;
break;
}
else {
i++;
}
}
max == 0 && sonPos == 0 ? m_next++ : m_next;
sonPos = max;
}
}
if (flag == 0) {
cout << "无" << endl;
}
}
int main() {
string str, a;
cout << "输入主串" << endl;
cin >> str;
cout << "输入子串" << endl;
cin >> a;
int next = 0;
getmax(str, a, next);
system("pause");
return 0;
}