顺序串

本文探讨了如何在顺序串中查找特定子串的方法,包括递归算法、字符串元素逆置、计算next和nextval数组,以及统计各字符出现次数。同时,还介绍了查找子串最后一次出现位置的技术。
摘要由CSDN通过智能技术生成

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++;
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值