📄 kmp.cpp
字号:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
/***************************声明函数*************************************/
int CharKmp(string,string,int); //KMP算法
void GetNext(); //求Next值
void Install(string,string); //初始化操作
void QuickSort(string str[],int low,int high);//将筛选出来的字串进行排序
int Partition(string str[],int low,int high);//运用快速排序法将整个字串分成两部分
int GetLength();
/***************************定义变量*************************************/
string s1,t1;
int m,n;
char*s;
char*t;
int*next;
static string model;
int amount=0;
int length;
/************************************************************************/
int main()
{
//定义变量
string *raw;
string *sort;
string b;
raw = new string[(length=GetLength())];
sort = new string[length];
int i;
//从文件中读取数据
ifstream fin;
fin.open("G:\\KMP\\yuanshi.txt");
if(!fin){
cout<<"不能打开文件!"<<endl;
return 0;
}
for(i=0;i<length;i++)
{
fin>>b;
raw[i]=b;
}
fin.close();
//自定义输入匹配模板
cout<<"请输入匹配的模板: ";
cin>>model;
//在全部数据中查找与模板相符合的数据然后输出
for(i=0;i<length;i++)
{
int position=0;
position=CharKmp(raw[i],model,1);
if(position!=0)
{
sort[amount]=raw[i];
amount++;
}
}
if(amount==0)
cout<<"原始数据中没有与输入模板相匹配的值!"<<endl;
else
{
QuickSort(sort,0,amount-1);
cout<<"匹配并排序之后的结果为:"<<endl;
for(i=0;i<amount;i++)
cout<<sort[i]<<" "<<endl;
}
delete[] s;
delete[] t;
delete[] next;
return 0;
}
/************************************************************************/
//KMP算法函数
int CharKmp(string s0,string t0,int pos)
{
Install(s0,t0);
GetNext();
int i=pos;
int j=1;
while (i<=((int)(s[0]))&&j<=((int)t[0]))
{
if(j==0||(s[i]==t[j]))
{
++i;
++j;
}
else
j=next[j];
}
if(j==((int)t[0])+1)
return 1;
else
return 0;
}
/************************************************************************/
//相当于初始化操作,求字串长度及每个字符
void Install(string ss,string tt)
{
s1=ss;
t1=tt;
m=s1.length();
n=t1.length();
s=new char[m+1];
t=new char[n+1];
s[0]=m;
t[0]=n;
for(int i=1;i<=m;i++)
s[i]=s1.at(i-1);
for(int j=1;j<=n;j++)
t[j]=t1.at(j-1);
}
/************************************************************************/
//获取Next值
void GetNext()
{
next = new int[n+1];
next[0]=9999;
int j=1;
int k=0;
next[1]=0;
while(j<(int)(t[0]))
{
if(k==0||t[j]==t[k])
{
++j;
++k;
next[j]=k;
}
else
k=next[k];
}
}
/************************************************************************/
void QuickSort(string str[],int low,int high)
{
int pivotloc;
if(low<high)
{
pivotloc=Partition(str,low,high);
QuickSort(str,low,pivotloc-1);
QuickSort(str,pivotloc+1,high);
}
}
/************************************************************************/
int Partition(string str[],int low,int high)
{
int highcomparepivotkey;
int pivotkeycomparelow;
string tmp=str[low];
while(low<high)
{
highcomparepivotkey=(str[high]).compare(0,sizeof(str[high]),tmp);
if(highcomparepivotkey==0)
highcomparepivotkey=1;
if(highcomparepivotkey==-1)
highcomparepivotkey=0;
while(low < high && highcomparepivotkey)
{
--high;
highcomparepivotkey=(str[high]).compare(0,sizeof(str[high]),tmp);
if(highcomparepivotkey==0)
highcomparepivotkey=1;
if(highcomparepivotkey==-1)
highcomparepivotkey=0;
}
str[low]=str[high];
pivotkeycomparelow=tmp.compare(0,sizeof(tmp),str[low]);
if(pivotkeycomparelow==0)
pivotkeycomparelow=1;
if(pivotkeycomparelow==-1)
pivotkeycomparelow=0;
while(low<high && pivotkeycomparelow)
{
++low;
pivotkeycomparelow=tmp.compare(0,sizeof(tmp),str[low]);
if(pivotkeycomparelow==0)
pivotkeycomparelow=1;
if(pivotkeycomparelow==-1)
pivotkeycomparelow=0;
}
str[high]=str[low];
}
str[low]=tmp;
return low;
}
/************************************************************************/
int GetLength()
{
ifstream fin;
fin.open("G:\\KMP\\yuanshi.txt");
int length=-1;
string b;
do {
fin>>b;
length++;
} while(b!="");
fin.close();
return length;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -