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

    这个算法看了。很久啊。很难懂。。虽说现在会了。。不过。应用的根本不熟练

    老规矩。。。贴下代码。。纪念下。


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
        char *ch;
        int length;
    }SString;
    
    int strKMP(SString *S,SString *T,int pos,int next[]);    //求在主窜中S中第pos个字符之后的位置的KMP算法
    void get_next(SString *T,int next[]);    //求模式串中T的next函数值并存入数组next
    int StrAssign(SString *str,char *chars);    ///生成一个与chars相等的字符串
    
    
    int main()
    {
        SString S={NULL,0},T={NULL,0};
        int pos;
        int next[50];
        StrAssign(&S,"ababcabcacbab");
        StrAssign(&T,"cacba");
        get_next(&T,next);
    
        pos=strKMP(&S,&T,0,next);
        printf("%d\n",pos);
        return 0;
    }
    int StrAssign(SString *str,char *chars)
    {
        if(str->ch)        //清空str
            free(str->ch);
        str->ch = (char *)malloc((strlen(chars)+1)*sizeof(char));
        if( !str->ch )
            return 0;
        str->length = strlen(chars);
        strcpy(str->ch,chars);    //复制字符串
    
        return str->length;
    }
    
    int strKMP(SString *S,SString *T,int pos,int next[])
    {
        int i=pos,j=0;
        while(i < S->length && j < T->length)
        {
            if(j==-1 || S->ch[i] == T->ch[j])
            {
                i++;
                j++;
            }
             else
                j = next[j];
        }
        if(j >= T->length)
            return i - (T->length);
        else
            return -1;
    }
    
    void get_next(SString *T,int next[])
    {
        int i=0,j=-1;
        next[0]=-1;
        while(i < T->length-1)    //这里注意下
        {
            if(j==-1 || T->ch[i] == T->ch[j])
            {
                i++; j++;
                if(T->ch[i] != T->ch[j])
                    next[i]=j;
                else
                    next[i] = next[j];
            }
            else
                j = next[j];
        }
        
    }
  • 相关阅读:
    Grub 和 UEFI启动
    神舟战神插上耳机没有声音,重启又有声音..
    批处理 ------ @、ECHO OFF、ECHO ON 的使用
    linux command ------ find
    Adobe Premiere Pro CC ------ 快捷键
    分布式session一致性问题
    DNS域名解析
    CDN内容分发
    令牌桶限流算法和漏桶限流算法区别
    AOP与IOC区别
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2883522.html
Copyright © 2011-2022 走看看