zoukankan      html  css  js  c++  java
  • KMP字符串匹配(模板)

    描述:

      给出两个字符串 s1 和 s2 ,其中 s2 为 s1 的子串,求出 s2 在 s1 中所有出现的位置。同时要求输出 s2 的 fail 数组。

    思路:

      KMP模板。

    标程:

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1000001
    char s1[maxn],s2[maxn];
    int fail[maxn];
    int ans[maxn],cnt;
    int len1,len2,j=0;
    inline void get()
    {
        for(int i=2;i<=len2;i++)
        {
            while(j&&s2[i]!=s2[j+1])    j=fail[j];//不能继续匹配且j还没有减到0,考虑退一步 
            if(s2[i]==s2[j+1])    j++;//能匹配,j的值+1 
            fail[i]=j;
        }    
    }
    inline void kmp()
    {
        j=0;
        for(int i=1;i<=len1;i++)
        {
            while(j>0&&s1[i]!=s2[j+1])    j=fail[j];//不能继续匹配且j还没减到0,减小j的值 
            if(s1[i]==s2[j+1])    j++;//能继续匹配j,j的值+1 
            if(j==len2)//找到一处匹配 
            {
                ans[++cnt]=i-len2+1;//记录位置 
                j=fail[j];//往后跳,继续找 
            }
        }
    }
    int main()
    {
        scanf("%s",s1+1);
        scanf("%s",s2+1);
        len1=strlen(s1+1);
        len2=strlen(s2+1);
        get();
        kmp();
        for(int i=1;i<=cnt;i++)
            printf("%d
    ",ans[i]);//输出s2在s1中出现的位置 
        for(int i=1;i<=len2;i++)
            printf("%d ",fail[i]);//输出fail数组 
    return 0;
    }
  • 相关阅读:
    构造并判断二叉搜索树-js
    构造树并判断是否对称
    旋转图像
    螺旋矩阵
    链表实现快速排序
    任务调度器
    队列的实现
    最大矩形
    棒球比赛
    复原IP地址
  • 原文地址:https://www.cnblogs.com/lck-lck/p/9714789.html
Copyright © 2011-2022 走看看