zoukankan      html  css  js  c++  java
  • 模式匹配.


    kmp算法:书中给出的定义:

    一.  新建匹配字符串(非匹配的目标文本)的长度的next数组的算法:

    (1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。

    (2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
            如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
    (3)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
     即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]且T[j] != T[k].(1≤k<j);
     (4) next[j]=0 意义:除(1)(2)(3)的其他情况。

    代码实现:

    public void KMPSetNext(char[]a,int next[]){

    if(a!=null && next!=null && a.length>0 && next.length>0&&a.length == next.length){
    next[0] = -1;
    int i = 0;
    int k = -1;
    while(i<a.length-1){
    if(k==-1||a[i] == a[k]){
    i++;
    k++;
    if(a[i]!=a[k])
    next[i] = k;
    else{
    next[i] = next[k];
    }
    }else{
    k= next[k];
    }
    }
    }
    }

    找自己前面n个和前n个字符相同,且自己不等于n+1个,就是n,否则 自己不等于第一个,模就是0,否则-1.


    二.用next数组来匹配文本: 

    实现原理: 如果文本和匹配字符串相等,文本和字符串继续+1比较,否则 如果next数组不是-1模式串右移,next数组是-1文本右移1,模式匹配串重新开始.

    代码:

    if(Text[i]== Pattern[j])
    {
    ++i;// 继续比较后继字符
    ++j;
    }
    else
    {
    if(next[j]!=-1)
    j=next[j];// 模式串向右移动
    else
    {
    j=0;
    ++i;
    }
    }

    自己总结: 

  • 相关阅读:
    4.eureka控制台显示注册的服务IP以及心跳间隔和服务续约时间设置
    3.eureka高可用
    2.注册中心eureka
    1.模拟微服务环境
    oracle视图
    oracle分页查询与Rownum
    IDEA实用配置
    在django使用websocket
    dockerfile镜像设置中文
    python框架day01
  • 原文地址:https://www.cnblogs.com/thinkqin/p/3780936.html
Copyright © 2011-2022 走看看