zoukankan      html  css  js  c++  java
  • C++实现Kmp算法

    • Kmp算法:查找子串
      • 前缀和后缀公共最长子串长度就是next数组的值
      • 当text和pattern串不等时,pattern利用next数组进行回退,直到找到相等的字符或返回到开头
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 
    // shell , quick, kmp 
    // pattern 
    // 
    // abcabc
    // k = 0
    // q = 1
    void make_next(const char *pattern, int *next) {
    
        int q, k;
        int m = strlen(pattern);
    
        next[0] = 0; // 
        for (q = 1,k = 0;q < m; q ++) {
    
            while (k > 0 && pattern[q] != pattern[k]) {
                k = next[k-1];
            }
    
            if (pattern[q] == pattern[k]) { // 如果前缀与后缀有相同的字符
                k ++;
            }
    
            next[q] = k;
            
        }
    }
    
    
    int kmp(const char *text, const char *pattern, int *next) {
    
        int n = strlen(text);
        int m = strlen(pattern);
    
        make_next(pattern, next);
    
        int i, q;
        for (i = 0, q = 0;i < n;i ++) { //i --> text, q --> pattern
    #if 1
            while (q > 0 && pattern[q] != text[i]) {
                q = next[q-1];
            }
    #endif 
            if (pattern[q] == text[i]) {
                q ++;
            }
            // q == m --->  
            if (q == m) {
                return i-q+1;
            }
        }
        return -1;
    }
    
    
    int main() {
    
        char *text = "abcabcabcabcabcd";
        char *pattern = "abcabcd";
        int next[20] = {0};
    
        int idx = kmp(text, pattern, next);
        printf("match pattern: %d
    ", idx);
    }

  • 相关阅读:
    django orm查询和后端缓存的使用
    QuerySet的常用方法
    使用wsgiref手撸web框架
    requests小技巧
    rabbitmq简单使用
    redis简单使用
    pycharm中mongodb可视化插件
    datatime汇总
    python编码和数据转化问题汇总
    mongoengine简单使用
  • 原文地址:https://www.cnblogs.com/ZGreMount/p/15480461.html
Copyright © 2011-2022 走看看