2022.2.8

上午:

学习KMP算法

看网课

下午:

P3375 【模板】KMP字符串匹配

(因为是输入字符所以用了cin>>来输入)

思路:

得到前缀表,输出(即最后一排的数字)

利用前缀表来判断下一步要和谁比对

#include<bits/stdc++.h>
using namespace std;
int prefix[1000001];
int lens1,lens2;
char s1[1000001],s2[1000001];
void get_next()
{
    int j=0;
    //得到前缀数组
    //(因为kmp[1]=0,而全局变量本来就会自动复制你为0,所以这里可以省略)
    for (int i=2;i<=lens2;i++)
    {
        while(j!=0&&s2[i]!=s2[j+1])
            j=prefix[j];
        if(s2[j+1]==s2[i])
            j++;
        prefix[i]=j;
    }
}
//可以用这个函数来找到下一步要比对的位置
void KMP()
{
    int j=0;
    for(int i=1;i<=lens1;i++)
    {
        while(j>0&&s2[j+1]!=s1[i])
            j=prefix[j];
        if(s2[j+1]==s1[i])
            j++;
        if(j==lens2)
        {
            cout<<i-lens2+1<<endl;
        }
    }
}
int main()
{
    //首先输入两个字符串
    cin>>s1+1;
    cin>>s2+1;
    //得到两个字符串的长度
    lens1=strlen(s1+1);
    lens2=strlen(s2+1);
    //通过get_next函数来得到前缀表prefix[];(这一步我已经解决)
    get_next();
    //再通过函数KMP得到匹配字符串的准确位置
    KMP();
    //按照题目要求输出前缀表
    for (int i=1;i<=lens2;i++)
        cout<<prefix[i]<<" ";
    cout<<endl;
    return 0;
}

晚上:

学习哈希

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值