zoukankan      html  css  js  c++  java
  • KMP算法c语言实现

    /**
    * author:lingd
    * date:2013-12-5
    */
    
    #include<stdio.h>
    #include<string.h>
    #define String char*
    
    
    void get_next(String ,int* );
    int str_pos(String ,String  ,int );
    void get_nextval(String T,int* next);
    
    int main(void){
        int next[100],len,i;
        String s = "ababababdcabababababdc";
        String t = "abababc";
        printf("%d",str_pos(s,t,0));
        return 0;
    }
    
    void get_next(String T,int* next){
        int j,i,lenT;
        j = -1;
        i = 0;
        lenT = strlen(T);
        next[0] = -1;
        while(i < lenT){
            if(j == -1 || T[j] == T[i]){  //i是后缀  j是前缀
                i++;
                j++;
                next[i] = j;
            }else{
                j = next[j];
            }
        }
    }
    
    //改进
    void get_nextval(String T,int* next){
        int j,i,lenT;
        j = -1;
        i = 0;
        lenT = strlen(T);
        next[0] = -1;
        while(i < lenT){
            if(j == -1 || T[j] == T[i]){ //i是后缀 j是前缀
                i++;
                j++;
                if(T[j] != T[i]){
                    next[i] = j;
                }else{
                    next[i] = next[j];
                }
            }else{
                j = next[j];
            }
        }
    }
    
    /**
        S主串
        T子串
        pos  开始匹配的子串起始位置
        return 位置  or  -1(无匹配)
    */
    int str_pos(String S,String T ,int pos){
        int lenS,lenT,i,j;
        int next[255];
        lenS = strlen(S);
        lenT = strlen(T);
        i = pos;
        j = 0;
        //get_next(T,next);  //改进前
        get_nextval(T,next); //改进后
        while(i < lenS && j < lenT){
            if(j == -1 || T[j] == S[i]){
                i++;
                j++;
            }else{
                j = next[j]; //回朔j
            }
        }
        
        //有匹配
        if(j >= lenT){
            return i - lenT;
        }
    
        return -1; //没有匹配
    }
    
    /*
     0 1 2 3 4 5 6
     a b a b a b c
    -1 0 0 1 2 3 4    //改进前的next
    -1 0-1 0-1 0 4      //改进后的next
     */  
    
     
  • 相关阅读:
    mysql--主从复制
    Linux--部署Vue项目
    Linux--安装node.js
    Linux--防火墙和vim
    go.js
    服务端和客户端通信的三种方式
    mysql-排序过程
    数据分析-Numpy
    shell
    Linux-crontab
  • 原文地址:https://www.cnblogs.com/phper007/p/3459232.html
Copyright © 2011-2022 走看看