栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

字符串匹配

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

字符串匹配

利用map进行跳跃(不适用于太长的子字符串)【map存不下】【拉胯】

#include 
#include 
#include 
#include 

using namespace std;
int main()
{
    int n,m;
    string s,ss;
    cin>>n>>ss;
    cin>>m>>s;
    mapmp;
    mp[ss]=-1;
    for (int i = 1; i <= n; i ++ )
    {
        ss.erase(n-i,1);
        //cout<0)
            {
                i+=(mp[sss]-1);
                break;
            }
            sss.erase(0,1);
        }
    }
}

kmp算法

#include
#include
#include
#include
#include
#include
using namespace std;
char s[2000000],p[2000000];
int kmp[2000000];
int main()
{
    int n,m;
    cin>>n;cin>>p+1;
    cin>>m;cin>>s+1;
    int k=0;
    for (int i = 2; i <= n; i ++ )
    {
        while(k&&p[i]!=p[k+1])k=kmp[k];
        if(p[i]==p[k+1])k++;
        kmp[i]=k;
    }
    k=0;
    for (int i = 1; i <= m; i ++ )
    {
        while(k&&s[i]!=p[k+1])k=kmp[k];
        if(s[i]==p[k+1])k++;
        if(k==n)
        {
            cout< 
#include 
using namespace std;
const int N = 100010, M = 1000010;
int n, m;
int ne[N];
char s[M], p[N];
int main()
{
    cin >> n >> p + 1 >> m >> s + 1;
    //子串自我匹配
    for (int i = 2, j = 0; i <= n; i ++ )
    {
        while (j && p[i] != p[j + 1]) j = ne[j];
        if (p[i] == p[j + 1]) j ++ ;
        ne[i] = j;
    }

    //举例abcab
    

    for (int i = 1, j = 0; i <= m; i ++ )
    {
        while (j && s[i] != p[j + 1]) j = ne[j];
        if (s[i] == p[j + 1]) j ++ ;
        if (j == n)
        {
            printf("%d ", i - n);
            j = ne[j];
        }
    }
    //举例abcabcabe
    
    return 0;
}

参考:AcWing 831. KMP字符串 - AcWinghttps://www.acwing.com/activity/content/code/content/43108/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289767.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号