zoukankan      html  css  js  c++  java
  • 4、KMP(看*)算法

    #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);
    
    }
  • 相关阅读:
    STL中的string
    STL中的map
    STL中的set和multiset
    C++基础知识
    希尔排序
    桶排序
    归并排序
    堆排序
    数组左边奇数右边偶数算法O(n)
    背包问题 洛谷P1164 小A点菜
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/14275495.html
Copyright © 2011-2022 走看看