zoukankan      html  css  js  c++  java
  • 字符串匹配

    KMP

    #include <stdio.h>
    #include <string.h>
    #define N 102
    
    int len1, len2;
    char des[N], pat[N];
    int next[N], ans;
    
    void Init()
    {
        scanf("%d%d", &len1, &len2);
        getchar();
        for(int i=0; i<len1; i++)
            scanf("%c", &des[i]);
        getchar();
        for(int j=0; j<len2; j++)
            scanf("%c", &pat[j]);
    }
    /*
        对Next函数处理过程的理解参看图示
    */
    void Next(char str[], int len)
    {
        memset(next, -1, sizeof(next));
        for(int j=1; j<len; j++)
        {
            int i = next[j-1];
            while(str[j]!=str[i+1] && i>=0)
            {
                i = next[i];
            }
            if(str[j] == str[i+1])
                next[j] = i+1;
            else
                next[j] = -1;
        }
    }
    /*
        目标串des长度为len1,对应s下标
        模式串pat长度为len2,对应p下标
    */
    void Kmp(char des[], int len1, char pat[], int len2)
    {
        int s = 0, p = 0;
        while(s<len1 && p<len2)
        {
            if(des[s] == pat[p])
            {
                s++;
                p++;
            }
            else
            {
                if(p == 0)
                    s++;                // pat第一个字符就匹配失败,则从des下一个开始
                else
                    p = next[p-1] + 1;  // pat下标p根据next快速回退到指定位置
            }
        }
        if(p < len2)                    // 整体匹配失败
            ans = -1;
        else ans = s-len2;              // 整体匹配成功          
        printf("ans = %d
    ", ans);
    }
    int main()
    {
        Init();
        Next(pat, len2);
        Kmp(des, len1, pat, len2);
        return 0;
    }
  • 相关阅读:
    AMQP协议
    设计模式三:行为型模式
    设计模式二:结构型模式
    设计模式一:创建型模式
    算法进阶
    数据结构
    希尔排序、计数排序、桶排序、基数排序
    归并排序
    python Gevent协程
    python——多进程
  • 原文地址:https://www.cnblogs.com/1203ljh/p/4642846.html
Copyright © 2011-2022 走看看