zoukankan      html  css  js  c++  java
  • KMP算法

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    int* make_pmt(const char *p)   //得到回溯的数组
    {
        unsigned int len = strlen(p);
        int *ret = static_cast<int *>(malloc(sizeof(int)*len));
        if (NULL != ret)
        {
            ret[0] = 0;
            int ll = 0;
            for (unsigned int i = 1; i < len; i++)
            {
                while (ll > 0 && p[ll] != p[i])
                {
                    ll = ret[ll - 1];
                }
                if (p[ll] == p[i])
                {
                    ll++;
                }
                ret[i] = ll;
            }
        }
        return ret;
    }
    
    int KMP(const char *s, const char *p)
    {
        int ret = -1;
        int sl = strlen(s);
        int pl = strlen(p);
        int *pmt = make_pmt(p);
        for (int i = 0, j = 0; i < sl; i++)
        {
            while ((j > 0) && (s[i] != p[j]))
            {
                j = pmt[j - 1];
            }
            if (s[i] == p[j])
            {
                j++;
            }
            if (j == pl)
            {
                ret = i + 1 - pl;
                break;
            }
        }
        free(pmt);
        return ret;
    }
    int main()
    {
        //测试数据1,如果匹配到了就返回相应的下标,没有匹配到就返回-1
        int n = KMP("abcde","cde");
        cout << n << endl;
        //测试数据2
        n = KMP("abcde", "bcde");
        cout << n << endl;
        return 0;
    }
  • 相关阅读:
    JavaScript 教程
    C#基础实例
    Angularjs实例5
    Angularjs实例4
    Angularjs 数据过滤
    Angularjs实例3
    Angularjs 数据循环
    Angularjs模块
    Angularjs 数据双向绑定
    Angularjs实例应用
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9664141.html
Copyright © 2011-2022 走看看