📊 计算NEXT/NEXTVAL数组

点击按钮计算NEXT或NEXTVAL数组

文本串:

模式串:

当前状态

等待开始...

Next数组 (失败函数):

-

📝 C语言实现代码

// KMP算法完整实现
#include <stdio.h>
#include <string.h>

// 构建Next数组(失败函数)
void buildNext(char* pattern, int* next, int m) {
    int j = 0;
    next[0] = 0;  // 第一个字符的next值为0
    
    for (int i = 1; i < m; i++) {
        // 当不匹配时,回退到next[j-1]位置
        while (j > 0 && pattern[i] != pattern[j]) {
            j = next[j - 1];
        }
        
        // 如果匹配,j前进一位
        if (pattern[i] == pattern[j]) {
            j++;
        }
        
        next[i] = j;  // 记录最长相同前后缀长度
    }
}

// KMP搜索算法
int kmpSearch(char* text, char* pattern) {
    int n = strlen(text);
    int m = strlen(pattern);
    
    if (m == 0) return 0;
    if (m > n) return -1;
    
    // 构建Next数组
    int next[m];
    buildNext(pattern, next, m);
    
    int j = 0;  // 模式串指针
    
    // 遍历文本串
    for (int i = 0; i < n; i++) {
        // 不匹配时根据next数组回退
        while (j > 0 && text[i] != pattern[j]) {
            j = next[j - 1];
        }
        
        // 匹配则前进
        if (text[i] == pattern[j]) {
            j++;
        }
        
        // 完全匹配
        if (j == m) {
            return i - m + 1;  // 返回匹配位置
        }
    }
    
    return -1;  // 未找到
}

// 主函数示例
int main() {
    char text[] = "ABABCABABABCABAB";
    char pattern[] = "ABABCABAB";
    
    int pos = kmpSearch(text, pattern);
    
    if (pos != -1) {
        printf("模式串在位置 %d 找到\n", pos);
    } else {
        printf("未找到模式串\n");
    }
    
    return 0;
}

/*
 * 算法复杂度分析:
 * 时间复杂度:O(n + m)
 * 空间复杂度:O(m)
 * 
 * 其中 n 是文本串长度,m 是模式串长度
 * 相比朴素匹配的 O(nm),KMP算法更高效
 */