s串中含t串的个数
/*【问题描述】设计算法实现求s串中所含t串的个数。
【输入形式】输入s串 和t串
【输出形式】输出s中含有t的个数
【样例输入】aaabaab
ab
【样例输出】2
2021/4/10
*/
#include <iostream>
using namespace std;
const int MaxSize=100;
class SqStringClass
{
char *data;
int length;
public:
SqStringClass();
~SqStringClass();
SqStringClass&operator=(char *cstr);
friend void GetNextval(SqStringClass&t,int nextval[]);
friend int SubStrNum(SqStringClass&s,SqStringClass&t);
friend int Count(SqStringClass &s,SqStringClass &t);
};
SqStringClass::SqStringClass()
{
data=new char[MaxSize];
length=0;
}
SqStringClass::~SqStringClass()
{
delete[]data;
}
SqStringClass&SqStringClass::operator=(char *cstr)
{
int i;
for(i=0;cstr[i]!='\0';i++)
data[i]=cstr[i];
length=i;
return *this;
}
void GetNextval(SqStringClass&t,int nextval[])//由模式串t求Nextval数组值
{
int j=0,k=-1;
nextval[0]=-1;
while(j<t.length)
{
if(k==-1||t.data[j]==t.data[k])//k=-1或比较的字符串相等时
{
j++;k++;
if(t.data[j]!=t.data[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else k=nextval[k];
}
}
int SubStrNum(SqStringClass&s,SqStringClass&t)//KMP算法求t在s中出现次数
{
int i=0,j=0,n=0;//次数n初始化为0
int nextval[MaxSize];
GetNextval(t,nextval);
while(i<s.length&&j<t.length)
{
if(j==-1||s.data[i]==t.data[j])
i++,j++;//i,j都加1
else
j=nextval[j];//i不变,j后退
if(j==t.length)
{
n++;//第一次匹配成功,n加1
j=0;//令j=0,继续匹配
}
}
return n;
}
int Count(SqStringClass &s,SqStringClass &t)
{
int i = 0, j = 0,sum = 0;
while(i < s.length && j < t.length)
{
if(s.data[i] == t.data[j])
{
i++;
j++;
}