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

    重点:理解next数组的含义,减少循环的时间。

    #include <bits/stdc++.h>
    using namespace std;
    const int N=10005;
    int next[1005];
    
    //优化过后的next 数组求法
    
    void GetNextval(string p)
    {
        int pLen = p.length();
        next[0] = -1;
        int k = -1;
        int j = 0;
        while (j < pLen - 1)
        {
            if (k == -1 || p[j] == p[k])
            {
                ++j;
                ++k;
                if (p[j] != p[k])
                    next[j] = k;   //之前只有这一行
                else
                    next[j] = next[k];
            }
            else
            {
                k = next[k];
            }
        }
    }
    int kmp(string s,string p)
    {
        int i = 0;
        int j = 0;
        int sLen = s.length();
        int pLen = p.length();
        while (i < sLen && j < pLen)
        {
            if (j == -1 || s[i] == p[j])
            {
                i++;
                j++;
            }
            else
            {
                j = next[j];
            }
        }
        if (j == pLen)
            return i - j;
        else
            return -1;
    }
    int main()
    {
       string s1,s2;
       cin>>s1>>s2;
       GetNextval(s2);
       cout<<kmp(s1,s2)<<endl;
    }
  • 相关阅读:
    导航
    占位
    django(一)
    进程与线程
    网络编程
    反射 单例模式
    面向对象及命名空间
    logging,包
    模块(二)os hashlib
    装饰器&递归
  • 原文地址:https://www.cnblogs.com/lhlccc/p/11621962.html
Copyright © 2011-2022 走看看