zoukankan      html  css  js  c++  java
  • 【sunday算法】玄学字符串匹配

    和KMP相似,用于字符串的匹配,貌似平均复杂度比KMP快,也比KMP更好理解。

    大概意思是:

    如果串b被串a包含,那么串a此时与串b匹配的部分一定一样

    所以如果从开头开始匹配到不同处时,在a串找中此时a串中对应的b串末尾下一位最靠右出现的位置,记作m

    如果找不到,直接跳过这一段(显然无法在这一段里找到答案)

    如果找到,就让b串中这个位置与m对齐

    大概是这么一个意思:

    Step1:比较至第二位时发现失配,比较两个染色位置的字符,发现相同

    Step2:将T字符从左往右数的第一个与S[4]相同的字符移至s[4]的下面,这样可以保证不会错过匹配项。(相关信息已存在asc数组中)。 
    这里写图片描述

    以此类推,不断比较。

    大概就是这个意思

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    char a[1000010],b[10010];
    int la,lb,asc[256];
    
    void sunday()
    {
        for(int i=0;i<=255;++i)
            asc[i]=lb+1;
        for(int i=1;i<lb;++i)
            asc[b[i]]=lb-i;
        int i=0,j=0;
        while(i<la&&j<lb)
        {
            for(;j<lb&&i+j<la&&a[i+j]==b[j];j++);
            if(j==lb)
            {
                printf("%d
    ",i+1);
                i++;
                j=0;
                continue;
            }
            if(i+lb>=la) return ;
            i+=asc[a[i+lb]];
        }
        return ;
    }
    
    int main()
    {
        scanf("%s%s",a,b);
        la=strlen(a+1);
        lb=strlen(b+1);
        sunday();
        return 0;
    }
  • 相关阅读:
    进程管理
    linux进程间的通信方式
    linux进程调度的算法
    安装haroopad
    SAE部署Java应用
    Jetty 8.1 安装 运行 部署
    javaweb学习总结(五)——Servlet开发(一)
    eclipse打war包
    Java基础学习总结——Java对象的序列化和反序列化
    Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置
  • 原文地址:https://www.cnblogs.com/rir1715/p/6797767.html
Copyright © 2011-2022 走看看