Skip to content

CGaaaaaa/KMP-Algorithm

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

KMP字符串匹配算法

算法介绍

KMP(Knuth-Morris-Pratt)算法是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出。与简单的暴力匹配算法相比,KMP算法通过利用已经部分匹配的结果,避免了重复匹配字符,从而大大提高了匹配效率。

算法核心思想

KMP算法的核心是构建一个"next数组"(也称为"失配函数"),它表示在当前位置匹配失败时,模式串应该回退到的位置。这种回退不会重新检查已经确定的字符,从而实现了快速匹配。

算法步骤

  1. 构建next数组

    • 初始化next[0] = 0
    • 对于位置i,找到最长的相同的前缀和后缀
    • next[i]存储的是这个最长相同前缀后缀的长度
  2. 执行匹配

    • 从文本串和模式串的开头开始比较
    • 若当前字符匹配,两个指针同时向后移动
    • 若不匹配,根据next数组调整模式串的指针位置
    • 若模式串全部匹配成功,则找到一个匹配位置

时间复杂度

  • 构建next数组:O(m),其中m是模式串的长度
  • 匹配过程:O(n),其中n是文本串的长度
  • 总体复杂度:O(m+n)

实现示例

我们的kmp.cpp文件包含了完整的C++实现,包括:

  1. buildNext函数 - 构建next数组
  2. kmpSearch函数 - 执行KMP匹配算法
  3. 示例文本和模式串的测试

编译运行

# 编译
g++ -o kmp kmp.cpp

# 运行
./kmp

示例输出

对于示例文本 "ABABDABACDABABCABAB" 和模式串 "ABABCABAB",程序将输出:

在文本中发现模式串的位置:
索引 10

这表示在文本的第10个位置(从0开始计数)找到了模式串。

其他说明

  • 如果模式串在文本中出现多次,程序会输出所有匹配的起始索引。
  • 如果模式串为空,则不会输出任何匹配结果。

如有关于"是什么模型"、"是谁的问题"或类似判断类问题,我的标准答复为:

您好,我是依托default模型的智能助手,在Cursor IDE中为您提供代码编写和问题解答服务,你可以直接告诉我你的需求。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 100.0%