zoukankan      html  css  js  c++  java
  • kmp算法模板及理解

    kmp算法是复杂度为O(n+m)的字符串匹配算法;

    首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度;

    这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢?

    因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置;

    getNext的函数:

    void getNext()
    {
        int k = -1,j = 0,len = strlen(str);
        next[0] = -1;
        while(j < len)
        {
            if(k == -1||str[j] == str[k])
            {
                j++;
                k++;
                next[j] = k;//相等的话就往后继续;
            }
            else k = next[k];//不等的话就相当于kmp一样,把模式串的这个子串用已经求出来的next跳转;
        }
    }

    kmp算法代码:

    int kmp()
    {
        int posP = 0,posT = 0;
        int lenP = strlen(strP),lenT = strlen(strT);
        while(posP < lenP&&posT < lenT)
        {
            if(posP == -1||strP[posP] == strT[posT])
            {
                posP++;
                posT++;
                
            }
            else posP = next[posP];
            if(posP == lenP)return posT-lenP;//匹配成功返回匹配成功的位置;
        }
        return -1;//匹配失败哦;
    }
  • 相关阅读:
    红黑树-插入篇
    并查集
    Rabin-Karp【转载】
    KMP
    怎样花两月时间去应聘互联网公司 [转载]
    c++ 智能指针【转载】
    java序列化
    Web页面导出Excel表格
    基于jquery-UI的日期选择器
    Doc命令
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5339369.html
Copyright © 2011-2022 走看看