public class KMP {
public static void InitNext(String dst, int[] next) {
next[0] = -1;
next[1] = 0;
int k = 0;
for (int i = 2; i < dst.length(); i++) {
// 找str[i-1]==str[k]位置
while (k != -1 && dst.charAt(i - 1) != dst.charAt(k)) {
k = next[k];
}
next[i] = k + 1;
}
}
// 使用KMP算法返回src第一个匹配dst的位置,下标从0开始,从src的pos位置开始匹配
public static int GetSubStrPos(String src, String dst, int pos) {
if (src == null || dst == null || src.length() == 0 || dst.length() == 0)
return -1;
if (pos >= src.length() || pos < 0)
return -1;
int i = pos;// 遍历src主串
int j = 0;// 遍历dst字串
int lenSrc = src.length();
int lenDst = dst.length();
// 计算字串的next数组
int[] next = new int[lenDst];
InitNext(dst, next);
while (i < lenSrc && j < lenDst) {
if (j == -1 || src.charAt(i) == dst.charAt(j)) {
//j==-1代表第一个字符就匹配失败,i从第二个字符开始匹配,j从0开始
i++;
j++;
} else {
// i不回退
j = next[j];
}
}
if (j >= lenDst) {
// 匹配成功,返回i-j
return i - j;
} else {
return -1;
}
}
public static void main(String[] args) {
// System.out.println(GetSubStrPos("abcabcabcdabcde", "abcd", 0));
System.out.println(GetSubStrPos("abcdabcabcdabcde", "abcd", 1));
}
}
数据结构王道考研2023年KMP串匹配算法C++/Java实现
需积分: 0 164 浏览量
更新于2022-11-03
收藏 2KB ZIP 举报
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便进行各种操作。在本资源中,我们重点关注的是字符串匹配算法——KMP(Knuth-Morris-Pratt)算法,这是一种用于在主串中寻找子串的高效算法,尤其适用于大数据集。在2023年的考研中,这样的算法可能会是考察的重点,因为它体现了对复杂问题的解决能力和编程技术。
让我们来理解KMP算法的基本思想。相比于朴素的暴力匹配算法(如BF算法,在压缩包中也有提供),KMP算法避免了不必要的字符比较。当发生不匹配时,KMP算法会利用已知的前缀和后缀关系,跳过一部分已比较过的字符,从而减少重复的比较。这种优化使得KMP算法在最坏情况下的时间复杂度达到O(m+n),其中m和n分别是主串和子串的长度。
C++和Java都是常用的数据结构和算法实现语言,KMP.cpp和KMP.java分别提供了这两个语言的实现。在C++中,通常使用STL库中的容器和算法,而在Java中,我们可以直接操作字符数组或者使用Java的String类。两者都需要理解和熟练掌握动态编程的概念,构建一个“部分匹配表”(也称失配表),这个表记录了每个前缀的最长公共后缀,是KMP算法的关键。
在实现KMP算法时,有以下几个关键步骤:
1. 构建部分匹配表:对于子串的每个位置i,找到其最长的前后缀并记录其长度,这将帮助我们在主串中跳过不匹配的部分。
2. 主串与子串的匹配过程:从0开始,比较主串和子串的第一个字符。如果匹配,移动两个指针;如果不匹配,根据部分匹配表的值,移动子串指针到适当位置,然后继续比较。
3. 当子串完全匹配时,返回匹配的起始位置;若遍历完整个主串仍未找到匹配,表示没有匹配的子串。
为了更好地理解和应用KMP算法,你需要熟悉字符串处理、数组操作以及动态规划的概念。同时,通过阅读和分析KMP.cpp和KMP.java代码,你可以加深对这两种语言特性的理解,例如C++的模板和指针,Java的面向对象特性等。
在学习过程中,如果遇到问题或发现代码中的错误,可以参考提供的GitHub地址(https://github.com/dodamce/DataStructure)查找更多资料,或者直接联系作者[email protected]寻求帮助。记得实践是检验真理的唯一标准,动手编写和调试代码是掌握算法的最好方法。
掌握KMP算法及其C++和Java实现对于提升你的编程技能和应对考研中的数据结构题目至关重要。通过深入学习和不断练习,你将能够更高效地处理字符串匹配问题,为未来的学术和职业发展打下坚实基础。

NUC_Dodamce
- 粉丝: 1912
最新资源
- aspmaker7.0
- aspmaker7.0
- matlab 解码 NMEA0183格式GGA数据
- matlab 解码 NMEA0183格式GGA数据
- matlab 解码 NMEA0183格式GGA数据
- 基于 InternLM2 的王者荣耀角色扮演项目:融合多模态技术的峡谷小狐仙妲己聊天机器人
- 为学习目的从零开始编写大语言模型(LLM)相关全部代码
- Single novel 单本小说系统,基于python爬虫+flask(新版),旧版生成html静态文件.zip
- Selenium UI 自动化测试框架(基于 python 3+selenium).zip
- SimpleChinese2 集成了包括拼音汉字转换、近义词、繁简转换等在内的许多基本的中文自然语言处理功能,使基于 Python 的中文文字处理和信息提取变得简单方便。.zip
- superman是套基于Python unitest框架开发的一套实用于API测试和WEB UI测试自动化框架.zip
- Ubuntu安装pyhton3、pip3,并且部署python web项目(基于django).zip
- Stock Backtrader Web App 是一个基于 Python 的项目,旨在简化股票回测和分析
- WeChatAI 是一款基于 Python 开发的微信群聊_个人智能助手,支持多种大语言模型,可以实现智能对话、自动回复等功能。采用现代化的界面设计,操作简单直观。.zip
- Wagtail是一套基于Python Django的内容管理系统,为很多大型机构,比如NASA、Google、MIT、Mizilla等所使用,本项目旨在将其官方文档翻译整理为中文语言。.zip
- Web接口开发与自动化测试 基于Python语言.zip