• 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);
    }

  • 相关阅读:
    vs code配置
    openssl
    右值目前
    elselect组件的问题
    HCIP记录
    ES的写入与查询的工作原理
    Limit offset,size 与limit size性能比较
    Es搜索引擎在数据量很大的情况下,如何提高查询效率?
    《一页纸学习法》豆瓣:7.5
    深拷贝浅拷贝区别
  • 原文地址:https://www.cnblogs.com/ZGreMount/p/15480461.html
Copyright © 2020-2023  润新知