数据结构_串_串的模式匹配_KMP算法_C++实现
head.h
#include<iostream>
#include<string>
using namespace std;
class STRING
{
public:
void GetString();
void GetSubString();
void KMP();
void Print();
private:
void GetNext();
string str;
string sub;
int next[1000];
int strlen;
int sublen;
};
void STRING::GetString()
{
cout << "Please Input The MainString :" << endl << endl;
cin >> str;
strlen = str.length();
}
void STRING::GetSubString()
{
cout << "Please Input The SubString :" << endl << endl;
cin >> sub;
sublen = sub.length();
}
void STRING::KMP()
{
cout << "KMP Method Called !" << endl << endl;
GetNext();
int i, j;
i = j = 0;
while (i < strlen && j < sublen)
{
if (j == -1 || str[i] == sub[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == sublen)
{
cout << "Succeed ! Position = " << i - j + 1 << endl << endl;
}
else
{
cout << "Failed !" << endl << endl;
}
}
void STRING::Print()
{
cout << "Main String = " << str << endl << " Length = " << strlen
<< endl;
cout << "SubString = " << sub << endl << " Length = " << sublen << endl
<< endl;
}
void STRING::GetNext()
{
int i, j;
next[0] = -1;
i = 0;
j = -1;
while (i < sublen - 1)
{
if (j == -1 || sub[i] == sub[j])
{
i++;
j++;
if (sub[i] != sub[j])
next[i] = j;
else
next[i] = next[j];
}
else
{
j = next[j];
}
}
}
main.cpp
#include<iostream>
#include"head.h"
using namespace std;
int main()
{
STRING str;
char choice;
while (1)
{
cout << "Your Choice Please ?" << endl << endl << "1 . Set Main String"
<< endl << "2 . Set SubString" << endl << "3 . KMP" << endl
<< "4 . Print" << endl << "5 . Quit" << endl << endl;
cin >> choice;
switch (choice)
{
case '1':
str.GetString();
break;
case '2':
str.GetSubString();
break;
case '3':
str.KMP();
break;
case '4':
str.Print();
break;
case '5':
return 0;
default:
cout << "No Such Choice !" << endl;
break;
}
}
}