KMP算法是一种高效的字符串匹配算法,其核心在于通过预处理模式串生成一个next数组,记录匹配失败时模式串指针应回退的位置。在匹配过程中,主串指针永不回溯,当字符失配时,模式串指针根据next值跳跃,从而避免重复比较,将时间复杂度优化至O(m+n)。


1. C/C++版代码:

const int maxn = 100005;
int next[maxn]; // next 数组
void getnext(char* s) { // 构造 next 数组
    next[0] = -1;
    int i = 0, j = -1;
    while (s[i]) {
        if (j == -1 || s[i] == s[j])
            next[++i] = ++j;
        else
            j = next[j];
    }
}
void kmp(char* a, char* b) { // 输出 a 中每个匹配 b 串的下标
    int blen = 0;
    while (b[blen]) blen++;
    getnext(b);
    int i = 0, j = 0;
    while (a[i]) {
        if (j == -1 || a[i] == b[j]) {
            i++, j++;
            if (!b[j]) {
                printf("%d ", i - blen);
                j = next[j];
            }
        } else {
            j = next[j];
        }
    }
}


2. Java版代码:

public class KMP {
    static final int maxn = 100005;
    static int[] next = new int[maxn];//next数组
    
    static void getnext(char[] s){//构造next数组,真正的模板
        next[0] = -1;
        int i = 0, j = -1; //j为什么初值赋值-1其实也行,仅仅是为了少一个判断,
        while(i < s.length && s[i] != 0){
            if(j == -1 || s[i] == s[j]) next[++i] = ++j;
            else j = next[j];
        }
    }
    
    static void kmp(char[] a, char[] b){ //输出b中每个匹配b串的下标,不同问题这个函数的写法多变
        int blen = 0;
        while(blen < b.length && b[blen] != 0) blen++;
        getnext(b);
        int i = 0, j = 0;
        while(i < a.length && a[i] != 0){
            if(j == -1 || a[i] == b[j]){
                i++; j++;
                if(j >= b.length || b[j] == 0){
                    System.out.print((i - blen) + " ");
                    j = next[j];
                }
            }
            else j = next[j];
        }
    }
}


3. Python版代码:

maxn = 100005
next_arr = [0] * maxn #next数组

def getnext(s):#构造next数组,真正的模板
    next_arr[0] = -1
    i, j = 0, -1 #j为什么初值赋值-1其实也行,仅仅是为了少一个判断,
    while i < len(s) and s[i] != '\0':
        if j == -1 or s[i] == s[j]:
            i += 1
            j += 1
            next_arr[i] = j
        else:
            j = next_arr[j]

def kmp(a, b): #输出b中每个匹配b串的下标,不同问题这个函数的写法多变
    blen = 0
    while blen < len(b) and b[blen] != '\0':
        blen += 1
    getnext(b)
    i, j = 0, 0
    while i < len(a) and a[i] != '\0':
        if j == -1 or a[i] == b[j]:
            i += 1
            j += 1
            if j >= len(b) or b[j] == '\0':
                print(i - blen, end=' ')
                j = next_arr[j]
        else:
            j = next_arr[j]
点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)