数据结构_串_串的模式匹配_KMP算法_C++实现

数据结构_串_串的模式匹配_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;
		}
	}
}

发表回复